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)
这是怎么回事?为什么我在二维情况下没有出错?
免责声明——这个答案肯定是不完整的
我认为您所看到的是奇特的序列索引的结果。由于字符串实际上是序列,因此您一次获取字符串的一个字符的值,并将它们转换为“ 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对象序列时故意保留字符串,以便更顺利地处理记录数组......
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |