2015-03-02 28 views
1

我想要做数组索引。我本来期望的结果是[0,1,1,0],但我只是得到一个错误。我该如何做这种类型的索引?列表中的python数组索引列表

a_np_array=np.array(['a','b','c','d']) 
print a_np_array in ['b', 'c'] 

Traceback (most recent call last): 
File "dfutmgmt_alpha_osis.py", line 130, in <module> 
print a_np_array in ['b', 'c'] 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

向上顶,其实我的意思是说[假,真,真,假]不是[0,1,1,0]作为我想要的布尔变量,所以我可以做索引

+0

确定。我检查了文档,这似乎是我正在寻找的。你能解释为什么我的方法不起作用吗?我很惊讶没有一种数组索引像方法来做到这一点。 – user2015487 2015-03-02 16:27:29

+0

我已经移动我的评论回答一些更多的解释。 – 2015-03-02 17:32:34

回答

1

首先,你不能索引使用[0,1,1,0]在这里,让你在使用了错误的牛逼呃。

>>> a_np_array[[0,1,1,0]] # Not useful at all 
array(['a', 'b', 'b', 'a'], 
     dtype='|S1') 

如果我理解这一点正确的你只是想检查a_np_array项目是否在['b', 'c']存在,对于使用numpy.in1d,但因为它返回布尔数组我们只是需要将其转换整数数组。

>>> np.in1d(a_np_array, ['b','c']) 
array([False, True, True, False], dtype=bool) 
>>> np.in1d(a_np_array, ['b','c']).astype(int) 
array([0, 1, 1, 0]) 

来到为什么a_np_array in ['b', 'c']没有工作?

这里in运营商将调用列表对象(['b', 'c']),然后的__contains__法列表中的每一个Python的对象将使用的方法PyObject_RichCompareBool每个项目比较a_np_arrayPyObject_RichCompareBool首先简单地检查,如果要比较的项目是同一个对象,即同一id(),如果是1的回报马上否则呼吁他们PyObject_RichCompare。因此,这将工作:

>>> a_np_array in [a_np_array, 'c', 'a'] 
True 

但这不会:

>>> a_np_array in [a_np_array.copy(), 'c', 'a'] 
Traceback (most recent call last): 
    File "<ipython-input-405-dfe2729bd10b>", line 1, in <module> 
    a_np_array in [a_np_array.copy(), 'c', 'a'] 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

现在Python将检查由PyObject_RichCompare返回的对象是否已经是一个布尔类型,即TrueFalse(这是用做PyBool_CheckPy_True),如果是则返回结果立即打电话,否则以PyObject_IsTrue检查对象是否可以被认为是truthy对象,这是通过调用该对象的__nonzero__方法来完成。对于一个NumPy数组,这将最终在返回的对象上调用bool(),这将引发您遇到的错误。这里NumPy的期待您来电或者all()any()检查所有物品是否True或至少一个。

>>> bool(a_np_array == 'a') 
Traceback (most recent call last): 
    File "<ipython-input-403-b7ced85c4f02>", line 1, in <module> 
    bool(a_np_array == 'a') 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

链接到源代码:

2

试试这个list comprehension

>>> print [int(x in ['b', 'c']) for x in a_np_array] 
[0, 1, 1, 0] 

利用的事实,int(True) == 1int(False) == 0