索引和切片结构化的ndarray

时间:2014-07-29 11:45:58

标签: python arrays numpy indexing record

现在我试图了解索引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中的错误?

1 个答案:

答案 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']都是索引字段切片的完美有效方法。