现在我试图了解索引numpy
结构化数组的可能方法,并且我有点陷入困境。只是几个简单的例子:
import numpy as np
arr = np.array(zip(range(5), range(5, 10)), dtype=[('a', int), ('b', int)])
arr[0] # first row (record)
arr[(0,)] # the same, as expected
arr['a'] # field 'a' of each record
arr[('a',)] # "IndexError: unsupported iterator index" ?!
arr[1:3] # second and third rows (records)
arr[1:3, 'a'] # "ValueError: invalid literal for long() with base 10: 'a'" ?!
arr['a', 1:3] # same error
arr[..., 'a'] # here too...
arr['a', ...] # and here
因此,出现了两个问题:
'a'
)的结果与对应的单tuple
(('a',)
)不同?arr['a'][1:3]
?如您所见,显而易见的arr['a', 1:3]
无效。我还观察了内置list
和非结构ndarray
的索引行为,但在那里找不到这样的问题:在元组中放入单个值并不会出现问题。 t更改任何内容,当然对于arr[1, 1:3]
ndarray
的索引如预期一样有效。鉴于此,我的示例中的错误是否应被视为numpy
中的错误?
答案 0 :(得分:2)
首先,字段与维度不同 - 尽管您的数组arr
有两个字段和五行,但numpy实际上将其视为一维(它具有形状(5,)
)。其次,当用作numpy数组的索引时,元组具有特殊的状态。当你将一个元组放在方形索引括号中时,numpy将它解释为一系列索引到数组的相应维度。在具有嵌套元组的特殊情况下,每个内部元组都被视为该维度的索引序列(就好像它是list
)。
由于字段不计入维度,因此当您使用arr[('a',)]
对其进行索引时,numpy会将'a'
解释为arr
行的索引。因此,引发IndexError
是因为字符串不是用于索引到数组维度的有效类型('第&#39行?)。
尝试arr['a', 1:3]
时会发生同样的事情,因为这相当于使用元组('a', slice(1, 3, None))
进行索引。 'a'
和1:3
之间的逗号是使其成为元组的逗号,无论是否缺少括号。同样,numpy尝试使用arr
索引'a'
行,这是无效的。但是,即使两个元素都是有效的索引类型,您仍然会得到IndexError
,因为元组(2)的长度大于arr
(1)中的维数。
arr['a'][1:3]
和arr[1:3]['a']
都是索引字段切片的完美有效方法。