列表中的python数组索引列表

时间:2015-03-02 16:17:49

标签: python arrays numpy indexing

我想做数组索引。我原以为结果是[0,1,1,0],但我只是得到一个错误。我该怎么做这种索引?

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()

在顶部,我实际上是想说[False,True,True,False]而不是[0,1,1,0]因为我想要bool所以我可以做索引

2 个答案:

答案 0 :(得分:2)

试试这个list comprehension

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

利用int(True) == 1int(False) == 0

这一事实

答案 1 :(得分: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运算符将调用列表对象的__contains__方法(['b', 'c']),然后对于列表中的每个对象,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_Check和{{3}完成的}),如果是,则立即返回结果,否则调用Py_True来检查对象是否可以被视为真正的对象,这是通过调用对象的__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()

源代码链接: