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