Python使用较小的布尔数组索引numpy数组

时间:2017-12-06 08:16:02

标签: python arrays numpy indexing

Docs CherryPy Tools

  

如果obj.ndim == x.ndim,x [obj]返回填充的1维数组   x的元素对应于obj的True值。该   搜索顺序将是行主,C风格。如果obj的真值为   超出x范围的条目,那么索引错误就会出现   被提高。如果obj小于x,则与填充它相同   假

我从numpy引用中读到,我可以使用较小的布尔数组索引较大的数组,其余的条目将自动填充为False。

  

示例:   从数组中,选择总和小于或等于2的所有行:

>>> x = np.array([[0, 1], [1, 1], [2, 2]])
>>> rowsum = x.sum(-1)
>>> x[rowsum <= 2, :] 
array([[0, 1],[1, 1]])
  

但如果rowsum也有两个维度:

>>> rowsum = x.sum(-1, keepdims=True)
>>> rowsum.shape 
(3, 1)
>>> x[rowsum <= 2, :]    # fails 
IndexError: too many indices
>>> x[rowsum <= 2] 
array([0, 1])
  

最后一个因为额外的而只给出第一个元素   尺寸。

但是这个例子根本不起作用,它说“IndexError:布尔索引与维度1的索引数组不匹配;维度为2但对应的布尔维度为1”

如何使它工作?我正在使用python 3.6.3和numpy 1.13.3。 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是NumPy广播。

import numpy as np

x = np.array([[0, 1], [1, 1], [2, 2]])
rowsum = x.sum(axis=1)
x[rowsum <= 2]

给出:

array([[0, 1],
   [1, 1]])

问题是您使用了keepdims=True,这意味着总和会创建一个列向量,而不是可以广播的一级数组。

答案 1 :(得分:2)

从Numpy 11开始,它与新的默认行为不兼容:(boolean-indexing-changes):

  

布尔索引更改。

     
      
  • ...

  •   
  • ...

  •   
  • 布尔索引必须与轴的维度匹配   他们索引。
  •   
  • ...
  •   

内部已经过优化,文档还没有......