在numpy对象数组中搜索

2 投票
2 回答
1913 浏览
提问于 2025-04-18 11:35

我有一个Numpy对象数组,它的类型是<type 'numpy.ndarray'>

>>> xt4
array([['D', 'F'], ['B', 'C', 'E']], dtype=object)

但是,当我用numpy.where在这个数组中查找一个特定的值时,它什么都没有返回,尽管这个值是存在的。

>>> numpy.where(xt4=='D')
(array([], dtype=int32),)

我本来期待能得到这个值在数组中的对应[行]/[列]索引。用int类型的值查找是没问题的,但当我在对象数组中查找字符串时就失败了。

编辑 1

  1. 我无法控制这个对象数组,而且它不太可能是一个方阵。
  2. 我需要在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]))

撰写回答