为什么numpy.r_使用括号而不是括号?

时间:2013-05-26 01:40:54

标签: python numpy

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])

1 个答案:

答案 0 :(得分:16)

可以创建任何Python类,以便其实例接受其中一种或两种符号:它将通过实现名为__call__的函数接受parens,并通过实现__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将很乐意传入任何对象并将其留给类来解决它的含义。< / p>