示例如下。这是什么?逗号在python列表括号中。我怎么能理解?
id(x[i,j]) == id(x[i][j])
显示为True。
那么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)基本的python
2)覆盖“ _getitem__”和
3)基本的numpy。
1)显示错误。 “ TypeError:列表索引必须是整数或切片,而不是元组”
2)有....如果我实施正确,没问题。
3)效果很好。
因此,我想numpy开发人员确实为元组实现了他们的“ getitem ”功能,并且它的工作原理相同arr [x,y,z] == arr [x] [y] [z]
答案 0 :(得分:2)
虽然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]
调用了两次。
答案 1 :(得分:0)
这是Numpy的特殊能力。
Numpy official docs
“与列表和元组不同,numpy数组支持多维数组的多维索引。这意味着不必将每个维度的索引都分成自己的方括号。”
>>> x.shape = (2,5) # now x is 2-dimensional
>>> x[1,3]
8
>>> x[1,-1]
9