我正在尝试使用numpy.where
来查找我想要的索引。这是代码:
import numpy as np
a = np.array([20,58,32,0,107,57]).reshape(2,3)
item_index = np.where((a == 58) | (a == 107) | (a == 20))
print item_index
我得到item_index
如下:
(array([0, 0, 1]), array([0, 1, 1]))
但实际上,a
的维度为20000 x 7
,条件为几百而不是三。有没有办法在多个条件下使用numpy.where
?我发现主题here,here和here很有用,但我无法找到问题的答案。
答案 0 :(得分:3)
给出(根据你的例子):
>>> a
array([[ 20, 58, 32],
[ 0, 107, 57]])
使用查询,'是值列表中a的数组元素',只需使用numpy.in1d:
>>> np.in1d(a, [58, 107, 20])
array([ True, True, False, False, True, False], dtype=bool)
如果您希望索引与基础数组相同,只需重塑为a
的形状:
>>> np.in1d(a, [58, 107, 20]).reshape(a.shape)
array([[ True, True, False],
[False, True, False]], dtype=bool)
然后对此进行测试:
>>> tests=np.in1d(a, [58, 107, 20]).reshape(a.shape)
>>> tests[1,1] # is the element of 'a' in the list [58, 107, 20]?
True
在一行中(显而易见,但我不知道一次性查询是否有效):
>>> np.in1d(a, [58, 107, 20]).reshape(a.shape)[1,1]
True
答案 1 :(得分:2)
更好的numpy可能有更好的解决方案 - 但是如果安装了pandas,你可以做这样的事情。
import pandas as pd
df = pd.DataFrame(a) # Create a pandas dataframe from array
conditions = [58, 107, 20]
item_index = df.isin(conditions).values.nonzero()
isin
构建布尔数组,其中True是conditions
列表中的值。对.values
的调用从pandas DataFrame中提取底层的numpy数组。对nonzero()
的调用将bool转换为1和0。
答案 2 :(得分:2)
为每个维度添加另一个维度,以便它们可以相互广播:
>>>
>>> a = np.array([20,58,32,0,107,57]).reshape(2,3)
>>> b = np.array([58, 107, 20])
>>> np.any(a[...,np.newaxis] == b[np.newaxis, ...], axis = 2)
array([[ True, True, False],
[False, True, False]], dtype=bool)
>>>