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)
您的命令返回一个一维数组,因为如果不 (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)