numpy中的多维布尔数组索引

cam*_*enl 5 python arrays numpy

我有两个二维数组,一个数字和一个布尔值:

x = 
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.],
       [ 8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.],
       [ 9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.]])

idx = 
array([[False, False, False, False, False, False, False, False, False, False],
       [False,  True,  True,  True,  True,  True, False, False, False, False],
       [False,  True,  True,  True,  True,  True, False, False, False, False],
       [False,  True,  True,  True,  True,  True, False, False, False, False],
       [False, False, False,  True,  True,  True,  True, False, False, False],
       [False, False, False, False,  True,  True,  True, False, False, False],
       [False, False, False, False, False, False,  True, False, False, False],
       [False, False, False, False, False, False, False,  True, False, False],
       [False, False, False, False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False, False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

当我索引数组时,它返回一个一维数组:

x[idx]
array([ 1.,  1.,  1.,  1.,  1.,  2.,  2.,  2.,  2.,  2.,  3.,  3.,  3.,
    3.,  3.,  4.,  4.,  4.,  4.,  5.,  5.,  5.,  6.,  7.])
Run Code Online (Sandbox Code Playgroud)

如何索引数组并返回具有预期输出的二维数组:

x[idx]
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.],
       [ 6.],
       [ 7.]])
Run Code Online (Sandbox Code Playgroud)

Kor*_*rem 4

您的命令返回一个一维数组,因为如果不 (a) 破坏通常需要的列结构就不可能实现。例如,7您请求的输出中的 最初属于第 7 列,现在位于第 0 列;(b)numpy据我所知,不支持同一维度上具有不同大小的高维数组。我的意思是 numpy 不能有一个前三行长度为 5、第四行长度为 4 等的数组 - 所有行(相同维度)需要具有相同的长度。

我认为您期望的最好结果是数组的数组(而不是二维数组)。这就是我构建它的方式,尽管可能有更好的方法我不知道:

In [9]: from itertools import izip
In [11]: array([r[ridx] for r, ridx in izip(x, idx) if ridx.sum() > 0])
Out[11]: 
array([array([ 1.,  1.,  1.,  1.,  1.]), array([ 2.,  2.,  2.,  2.,  2.]),
       array([ 3.,  3.,  3.,  3.,  3.]), array([ 4.,  4.,  4.,  4.]),
       array([ 5.,  5.,  5.]), array([ 6.]), array([ 7.])], dtype=object)
Run Code Online (Sandbox Code Playgroud)

  • @camdenl你拥有的是一个列表数组,而不是问题中所要求的二维numpy数组。无论如何,我认为使用“array([r[ridx].tolist() for r,ridx in izip(x, idx) if rodx.sum() > 0])”而不是“enumerate”更具可读性。 (2认同)