将numpy数组对象与多个条件进行比较

时间:2014-07-30 00:43:13

标签: python arrays numpy conditional-statements

我正在尝试使用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?我发现主题hereherehere很有用,但我无法找到问题的答案。

3 个答案:

答案 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)
>>>