【问题标题】:What is the fastest way to extract given rows and columns from a Numpy ndarray?从 Numpy ndarray 中提取给定行和列的最快方法是什么?
【发布时间】: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


【解决方案1】:

如果我尝试重现您的问题,我看不到如此剧烈的效果。我注意到根据您选择的索引数量,索引甚至可以比乘法更快。

>>> import numpy as np
>>> np.__version__
Out[1]: '1.9.0'
>>> N = 14000
>>> A = np.random.random(size=[N, N])

>>> indices = np.sort(np.random.choice(np.arange(N), 0.9*N, replace=False))
>>> timeit A[np.ix_(indices, indices)]
1 loops, best of 3: 1.02 s per loop
>>> timeit A.take(indices, axis=0).take(indices, axis=1)
1 loops, best of 3: 1.37 s per loop
>>> timeit np.multiply(A,A)
1 loops, best of 3: 748 ms per loop

>>> indices = np.sort(np.random.choice(np.arange(N), 0.7*N, replace=False))
>>> timeit A[np.ix_(indices, indices)]
1 loops, best of 3: 633 ms per loop
>>> timeit A.take(indices, axis=0).take(indices, axis=1)
1 loops, best of 3: 946 ms per loop
>>> timeit np.multiply(A,A)
1 loops, best of 3: 728 ms per loop

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多