【问题标题】:Numpy advanced indexing, bool vs. int IndexError: too many indices for arrayNumpy 高级索引,bool 与 int IndexError:数组索引过多
【发布时间】:2020-03-04 16:17:03
【问题描述】:

尝试在矩阵中使用 numpy 高级索引 - https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

这按预期工作,返回整个矩阵,v

import numpy as np
v = np.reshape(np.arange(0,9), (3,3))
v[np.asarray([0,1,2])[:,np.newaxis], np.asarray([0,1,2])]

使用逻辑索引也可以按预期工作:

v[np.asarray([0,1,2])[:,np.newaxis], np.asarray([True, True, True])]

令人惊讶的是(至少对我而言),切换索引向量的顺序时出现此错误?

v[np.asarray([True, True, True])[:,np.newaxis], np.asarray([0,1,2])]

或者如果两个向量都是布尔值

v[np.asarray([True, True, True])[:,np.newaxis], np.asarray([True, True, True])]

出现错误“*** IndexError:数组索引过多”。我希望第三个和第四个例子能像第一个和第二个一样工作。我错过了什么?

【问题讨论】:

  • docs.scipy.org/doc/numpy/reference/… - 这个布尔索引部分的最后一部分说您需要使用np.ix_ 来生成相关索引。它将布尔值转换为等效的nonzero 索引。广播不适用于布尔数组。
  • 这是什么上下文,你想从数组中提取什么以及索引来自哪里?
  • @hpaulj 你是对的。广播只是不适用于布尔数组的高级索引。我很困惑,因为它看起来像示例 2 中的工作。如果你回答我会接受它

标签: python numpy indexing boolean


【解决方案1】:

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing

这个布尔索引部分的最后一部分说您需要使用 np.ix_ 来生成相关索引。它将布尔值转换为等效的非零索引。广播不适用于布尔数组

In [48]: np.ix_(np.asarray([True, True, True]), np.asarray([0,1,2]))            
Out[48]: 
(array([[0],
        [1],
        [2]]), array([[0, 1, 2]]))

ix_ 生成正确的数组索引来执行块索引:

In [50]: v[np.ix_(np.asarray([True, True, True]), np.asarray([0,1,2]))]         
Out[50]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

没有ix的相同数组选择对角线:

In [51]: v[np.asarray([True, True, True]), np.asarray([0,1,2])]                 
Out[51]: array([0, 4, 8])

假设布尔索引是使用某种形式的np.where/nonzero 完成的,这个二维nonzero 结果可能会导致索引错误。但它发生在编译代码中,因此很难追踪细节:

In [53]: np.asarray([True, True, True])[:,np.newaxis].nonzero()                 
Out[53]: (array([0, 1, 2]), array([0, 0, 0]))

我们可以使用与v 形状匹配的布尔值进行索引,但结果是 1d:

In [66]: np.array([True,True,True])[:,None].repeat(3,1)                         
Out[66]: 
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])
In [67]: v[_]                                                                   
Out[67]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2019-12-02
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多