花哨索引多维度:超立方体的布尔矩阵?

时间:2014-11-06 23:55:14

标签: python numpy

让我们假设以下示例:

import numpy as np
x = np.random.random([100,200,300,400])
c1 = np.arange(0,100,17)
c2 = np.arange(0,100,17)
c3 = np.arange(0,100,17)
c4 = np.arange(0,100,17)
q = (((x[c1,:,:,:])[:,c2,:,:])[:,:,c3,:])[:,:,:,c4]

这是查看thisthis后效率最低的方式,这些告诉我将4d数组解析为1d然后仅在一个维度中进行索引是个好主意。那么,有没有更好的方法来实现我想要实现的目标呢?

1 个答案:

答案 0 :(得分:1)

您可以使用np.ix_来构建适当的索引:

>>> %timeit q = (((x[c1,:,:,:])[:,c2,:,:])[:,:,c3,:])[:,:,:,c4]
1 loops, best of 3: 237 ms per loop
>>> %timeit q = x[np.ix_(c1, c2, c3, c4)]
100000 loops, best of 3: 19.3 µs per loop

这快了几个数量级,但结果相同:

>>> np.allclose((((x[c1,:,:,:])[:,c2,:,:])[:,:,c3,:])[:,:,:,c4], x[np.ix_(c1, c2, c3, c4)])
True