我需要在两个维度上切分中等大小的2d Numpy阵列。作为实例,加速Numpy阵列切片
import numpy as np
X = np.random.normal(loc=0, scale=1, size=(3000, 100))
从该阵列中,我需要选择大量的行和相当小数量的列,例如
row_idx = np.random.random_integers(0, 2999, 2500)
col_idx = np.random.random_integers(0, 99, 10)
现在,我这样做是通过以下命令:
X.take(col_idx, axis=1).take(row_idx, axis=0)
这需要我的电脑上大约115μs。问题是我需要每次运行数百万次执行此步骤。
你是否看到有机会加速这个速度?
编辑(附加信息): 我有一个矩阵X是nxk。这n行包含1xk向量。 有三组:活动组(V),左组(L)和右组(R)。此外,还有系数v0和v。我需要计算此数量:http://goo.gl/KNoSl3(对不起,我无法发布图像)。问题中的公式选择左(右)集中的所有X行以及活动集中的所有列。
编辑2
我发现了另一个小的改进。
X.take(col_idx, axis=1, mode='clip').take(row_idx, axis=0, mode='clip')
有点快(我的机器上大概是25%)。
'take()'方法需要将所选行复制一列。你应该调整你的算法来制作这个不需要的东西。我们无法告诉你如何在没有进一步的背景下做到这一点。 –
你的指数多久改变一次? – Daniel
对于几十个观察值,行索引保持不变(更确切地说:我有k个变量,这些变量分为活动集和非活动集,我需要检查哪个变量是非活动集最合适 - 即行索引保持不变不变,只要我检查非活动集中的变量) – BayerSe