9

我想在字符串数组上使用 numpy.where 函数。但是,我这样做并不成功。有人可以帮我解决这个问题吗?

例如,当我numpy.where在以下示例中使用时,出现错误:

import numpy as np

A = ['apple', 'orange', 'apple', 'banana']

arr_index = np.where(A == 'apple',1,0)

我得到以下信息:

>>> arr_index
array(0)
>>> print A[arr_index]
>>> apple

但是,我想知道A字符串'apple'匹配的字符串数组中的索引。在上面的字符串中,这发生在 0 和 2。但是,np.where仅返回 0 而不是 2。

那么,我该如何numpy.where处理弦乐呢?提前致谢。

4

3 回答 3

12
print(a[arr_index])

不是array_index!!

a = np.array(['apple', 'orange', 'apple', 'banana'])

arr_index = np.where(a == 'apple')

print(arr_index)

print(a[arr_index])
于 2013-05-20T03:16:38.250 回答
0

还有一种方式:

def GetIndexOfStr(npArray,theStr): 
    #npArray is from type of numpy.ndarray where each item is of type np.str
    return np.where(npArray == theStr)[0][0]

A = np.array(['apple', 'orange', 'apple', 'banana'])
print(A[GetIndexOfStr(A,"apple")]) # ==> this will result in "apple"
print(A[GetIndexOfStr(A,"appleX")]) # ==> this will throw IndexError
于 2020-11-09T12:22:48.607 回答
0

问题是您需要使用数组而不是列表才能正确使用 where (另外,使用 True 和 False 而不是 1 和 0 来获取掩码来查找索引):

A = ['apple', 'orange', 'apple', 'banana']
arr_mask = np.where(np.array(A) == 'apple',True,False)
arr_index = np.arange(0, len(A))[arr_mask]

这样,您将获得 arr_index 为: np.array([0,2])

请注意,要使用掩码 arr_mask 或索引 arr_index 来查找 A 中的值,A 需要是一个数组:

In [55]: A = ['apple', 'orange', 'apple', 'banana'] 
    ...: arr_mask = np.where(np.array(A) == 'apple',True,False) 
    ...: arr_index = np.arange(0, len(A))[arr_mask]                                                             

In [56]: A[arr_mask]                                                                                            
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-f8b153319425> in <module>
----> 1 A[arr_mask]

TypeError: only integer scalar arrays can be converted to a scalar index

In [57]: A[arr_index]                                                                                           
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-57-91c260fe71ab> in <module>
----> 1 A[arr_index]

TypeError: only integer scalar arrays can be converted to a scalar index

In [58]: B = np.array(A)                                                                                        

In [59]: B[arr_mask]                                                                                            
Out[59]: array(['apple', 'apple'], dtype='<U6')

In [60]: B[arr_index]                                                                                           
Out[60]: array(['apple', 'apple'], dtype='<U6')

您仅使用列表得到的是函数 np.where() 找不到满足条件的任何地方。如果你试试:

A = ['apple', 'orange', 'apple', 'banana']
arr_index = np.where(A == 'orange',1,0)

您将再次获得 array(0) 作为输出。

于 2020-06-11T10:46:11.930 回答