你知道什么吗r_
做?它将切片转换为范围,然后将整个混乱连接在一起。
不知道你能不能用r_
或类似的东西来构建所需的索引。但:
In [168]: idx = np.where(a==0)
In [169]: idx
Out[169]:
(array([0, 0, 0, 0, 0, 1, 2]),
array([0, 1, 1, 1, 2, 1, 1]),
array([0, 0, 1, 2, 0, 0, 0]))
这让我们了解了所需的索引数组(减去一些可能的重复项)。
或许可以将这 3 个连接起来ogrid
列表成复合:
In [181]: np.ogrid[0:1,1:2,:3]
Out[181]: [array([[[0]]]), array([[[1]]]), array([[[0, 1, 2]]])]
In [182]: np.ogrid[0:1,:3,0:1]
Out[182]:
[array([[[0]]]), array([[[0],
[1],
[2]]]), array([[[0]]])]
In [183]: np.ogrid[:3,1:2,0:1]
Out[183]:
[array([[[0]],
[[1]],
[[2]]]), array([[[1]]]), array([[[0]]])]
他们分别选择 0a
.
最简单的方法可能是将它们转换为它们的等价物,然后连接生成的一维数组。
In [188]: np.ravel_multi_index(Out[181],(3,3,3))
Out[188]: array([[[3, 4, 5]]])
etc
In [195]: np.hstack([Out[188].ravel(), Out[189].ravel(), Out[190].ravel()])
Out[195]: array([ 3, 4, 5, 0, 3, 6, 3, 12, 21])
In [197]: a.flat[_]
Out[197]: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [199]: np.unravel_index(Out[195],(3,3,3))
Out[199]:
(array([0, 0, 0, 0, 0, 0, 0, 1, 2]),
array([1, 1, 1, 0, 1, 2, 1, 1, 1]),
array([0, 1, 2, 0, 0, 0, 0, 0, 0]))
Out[169]
and Out[199]
具有相同的值,但重复项除外。
这是连接多个一维切片问题的概括。建立索引然后连接所花费的时间与先连接索引所需的时间大致相同。