例子如下。这是什么?逗号是在Python列表支架。我该如何理解?
id(x[i,j]) == id(x[i][j])
显示真。
所以,x[i,j]
总是在同一x[i][j]
?
或者,x[i,j]
是x[(i,j)]
其实一样吗?指数是元组。
import numpy as np
x = np.random.random((64,3,32,10))
for i in range(x.shape[0]):
for j in range(x.shape[1]):
print(x[i,j])
====== 我想这是numpy的特殊实现。 NumPy的覆盖使用的元组指数“_getitem__”功能。
我试了 1)基本蟒 2)覆盖 “_getitem__” 和 3)基本numpy的。
1)示出错误。 “类型错误:列表索引必须是整数或片,而不是元组” 2)已....没有问题,如果我实现的权利。 3)只是效果很好。
所以,我想numpy的开发商并实施了他们的元组 “的GetItem” 功能,它的工作原理相同编曲[X,Y,Z] == ARR [X] [Y] [Z]。
虽然numpy的行为以同样的方式与两个,他们在技术上的不同。
您可以通过实现__getitem__
自己看到了差距:
class GetitemTest(object):
def __getitem__(self, item):
print("getting: %r" %(item, ))
return self
然后:
>>> x = GetitemTest()
>>> x[1,2]
getting: (1, 2)
<__main__.GetitemTest object at 0x10bb6d810>
>>> x[1][2]
getting: 1
getting: 2
<__main__.GetitemTest object at 0x10bb6d810>
请注意,x[1,2]
仅调用__getitem__
一次,但x[1][2]
调用它的两倍。
这是NumPy的特殊能力。 Numpy official docs “不像列表和元组,numpy的阵列支持多维索引多维数组,这意味着它是没有必要每个维度的指标分成了自己的一套方括号。”
>>> x.shape = (2,5) # now x is 2-dimensional
>>> x[1,3]
8
>>> x[1,-1]
9