在numpy对象数组中搜索
我有一个Numpy对象数组,它的类型是<type 'numpy.ndarray'>
。
>>> xt4
array([['D', 'F'], ['B', 'C', 'E']], dtype=object)
但是,当我用numpy.where在这个数组中查找一个特定的值时,它什么都没有返回,尽管这个值是存在的。
>>> numpy.where(xt4=='D')
(array([], dtype=int32),)
我本来期待能得到这个值在数组中的对应[行]/[列]
索引。用int
类型的值查找是没问题的,但当我在对象数组中查找字符串时就失败了。
编辑 1
- 我无法控制这个对象数组,而且它不太可能是一个方阵。
- 我需要在
nd.array
中找到的值的[行]/[列]
索引。
2 个回答
0
你的问题是,NumPy 并不像对待其他数组那样支持不规则数组。你可以创建不规则数组,但它们的表现可能和你想象的不同。
如果数组中的每一行长度都相同,那么它的表现就会如你所预期的那样。
>>> xt4 = array([['D', 'F'], ['B', 'C']], dtype=object)
>>> numpy.where(xt4=='D')
(array([0]), array([0]))
1
你现在有一个一维的对象数组,而这个命令中的 ==
操作符会简单地尝试将对象与对象进行匹配。最简单的理解方式就是这样:
>>> xt4=='D'
array([False, False], dtype=bool)
Numpy 会尝试将 D
和 ['D', 'F']
以及 ['B', 'C', 'E']
进行匹配。你可以像这样创建一个字符数组:
>>> arr = np.array([['D', 'F', 'G'], ['B', 'C', 'E']])
>>> arr
array([['D', 'F', 'G'],
['B', 'C', 'E']],
dtype='|S1')
在这里,任何类型的布尔索引都可以正常工作:
>>> arr=='D'
array([[ True, False, False],
[False, False, False]], dtype=bool)
>>> np.where(arr=='D')
(array([0]), array([0]))