使用包含数字的字符串进行索引时,2D numpy数组不会出错

tit*_*jan 11 python indexing numpy

当我在numpy中创建一维数组并使用一个字符串(包含数字)来索引它时,我得到了一个错误:

>>> import numpy as np
>>> a = np.arange(15)
>>> a['10']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: field named 10 not found.
Run Code Online (Sandbox Code Playgroud)

但是,当我创建一个二维数组并使用两个字符串进行索引时,它不会给出错误并返回该元素,就像首先将字符串转换为整数一样

>>> b = np.arange(15).reshape(3,5)
>>> b
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> b[1, 2]
7
>>> b['1', '2']
7
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?为什么我在二维情况下没有出错?

mgi*_*son 2

免责声明——这个答案肯定是不完整的

我认为您所看到的是奇特的序列索引的结果。由于字符串实际上是序列,因此您一次获取字符串的一个字符的值,并将它们转换为“ intp”对象(大概只是使用 python 的int函数)——然后为您提供数组索引。

这也解释了 1D 情况:

class Foo(object):
    def __getitem__(self,idx):
        print idx

a = Foo()
a[12]
a[12,12]
Run Code Online (Sandbox Code Playgroud)

请注意,在第二种情况下tuple传递 a,而在第一种情况下传递整数。


我仍然不明白的部分通过这个测试得到了证明:

import numpy as np
a = np.arange(156).reshape(13,12)
print a[12,3] == a['12',3]   #True -- I would have thought False for this one...
print a['12',3] == a[('1','2'),3]  #False -- I would have guessed True for this..
assert( a[tuple('12'),3] == a[(1,2),3] )  #This passes, as expected
Run Code Online (Sandbox Code Playgroud)

请随意尝试在评论中向我解释这一点。:) 差异可能是 numpy 在转换为intp对象序列时故意保留字符串,以便更顺利地处理记录数组......

  • @georgesl 部分原因是 `('1')` 不是元组,元组运算符(如果这是正确的词)是逗号,而不是括号。 (3认同)