【发布时间】:2014-10-23 21:12:03
【问题描述】:
我有一个大的(大约 14,000 x 14,000)方阵,表示为 Numpy ndarray。我希望提取大量行和列——我事先知道它们的索引,尽管它实际上是所有非全零的行和列——以获得一个新的方阵(大约 10,000 x 10,000)。
我发现最快的方法是:
> timeit A[np.ix_(indices, indices)]
1 loops, best of 3: 6.19 s per loop
但是,这比进行矩阵乘法所花费的时间要慢得多:
> timeit np.multiply(A, A)
1 loops, best of 3: 982 ms per loop
这看起来很奇怪,因为行/列提取和矩阵乘法都需要分配一个新数组(矩阵乘法的结果比提取的结果还要大),但矩阵乘法还需要执行额外的计算。
因此,问题是:有没有更有效的方法来执行提取,尤其是至少与矩阵乘法一样快?
【问题讨论】:
-
np.multiply(A, A)是 elementwise 乘法。使用np.dot(A, A)进行矩阵乘法。 -
如果您提供了一个工作程序来使用随机数据执行您想要的操作,这将有所帮助。我曾经发现 np.take() 比使用 [] 索引更快,但我不确定它是否对你的情况很重要。还是试试吧:docs.scipy.org/doc/numpy/reference/generated/numpy.take.html
-
@JohnZwinck:是的,像
r = A.take(indices, axis=0).take(indices, axis=1)这样的东西比使用[]索引更快(使用numpy 1.8.2)。 -
你想让我调试你的
np.ix_电话,因为新的 numpy 抱怨的东西一开始可能很有趣吗? -
np.ix_调用使用不同的 NumPy 1.9 测试版运行良好,所以我认为我们使用的版本中只是一个错误。尽管切换到 NumPy 1.9 有所帮助,但它并没有给我们带来我们真正想要的性能提升。我们最终在 Fortran 中实现了这一部分并使用 f2py 调用。
标签: python performance optimization numpy scipy