【问题标题】:python array indexing list in list列表中的python数组索引列表
【发布时间】:2015-03-02 16:17:49
【问题描述】:

我想做数组索引。我本来希望结果是 [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] 因为我想要布尔值所以我可以进行索引

【问题讨论】:

  • 好的。我检查了文档,这似乎是我正在寻找的。你能解释一下为什么我的方法不起作用吗?我很惊讶没有像数组索引这样的方法来做到这一点。
  • 我已将我的评论移至回答,并提供更多解释。

标签: python arrays numpy indexing


【解决方案1】:

试试这个list comprehension:

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

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

【讨论】:

    【解决方案2】:

    首先,您不能在此处使用[0,1,1,0] 进行索引,因此您使用了错误的术语。

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

    如果我理解正确,您只是想检查['b', 'c'] 中是否存在a_np_array 的项目,为此使用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_array 进行比较。 PyObject_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 来检查对象是否可以被认为是真实对象,这是通过调用对象的__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()
    

    源代码链接:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2018-11-13
      相关资源
      最近更新 更多