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])
任何 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 将愉快地传递任何对象并将其留给类来确定它的含义。