18

Numpy.r_、.c_ 和 .s_ 是我遇到的唯一将参数放在方括号而不是圆括号中的 Python 函数。为什么会这样?这些功能有什么特别之处吗?我可以制作自己的使用括号的函数(不是我想要的;只是好奇)?

例如,正确的语法是:

    np.r_['0,2', [1,2,3], [4,5,6]]

我本来希望它是:

    np.r_('0,2', [1,2,3], [4,5,6])
4

1 回答 1

19

任何 Python 类都可以使其实例接受一种或两种表示法:它将通过实现一个名为 的函数来接受括号__call__,并通过实现来接受括号__getitem__

np.r_碰巧是一个实现__getitem__比平常更花哨的事情的类。也就是说,r_(称为np.lib.index_tricks.RClass) 的类执行如下操作:

class RClass:
    def __getitem__(self, item):
        # r_ fancyness

很可能,这样做是为了利用切片符号 - 例如,当您有一个列表(或 np 数组或任何其他实现此协议的对象)l时,您可以:

l[:5]

, Python 自动创建一个slice对象传递给__getitem__.

此语法不适用于__call__- 用户必须通过l(slice(5)).

请注意,__call__可以采用您喜欢的任何参数;虽然__getitem__总是只接受一个参数:当你做类似的事情时my_array[1:3, 2:5],Python 会传入一个切片元组。但是,正如您在 中看到的r_,内容不限于数字和切片 - 与任何其他函数类似,Python 将愉快地传递任何对象并将其留给类来确定它的含义。

于 2013-05-26T01:48:47.653 回答