【发布时间】:2018-05-01 23:55:26
【问题描述】:
W 是一个矩阵,有 V 行。 u 是一个向量。我有两个 numpy 对象 W 和 u。
import numpy as np
import numpy.random as npr
V = 10
W = npr.normal(size=(V, 3))
u = npr.normal(size=(1,3))
如果我逐行计算,我可以这样做:
res = np.zeros(V)
for v in range(V):
res[v] = (W[v] - u).dot((W[v] - u).transpose())
但是一旦 V 变大(比如 5000)它可能会很慢,我需要一次又一次地重新计算它。 所以我尝试了矩阵乘法,但没有成功,因为它不是逐行乘法。
((W - u).transpose()).dot(W - u)
如何在 Numpy 中快速计算平方范数?
我打算使用 Cython,所以循环中的逐行乘法会比 Numpy 快吗?我了解到 Cython 有parallelization,但如果我在里面使用 Numpy 对象,Cython 似乎无法并行化for loop(添加于 11 月 20 日:可能我不能在prange 中使用 Python 对象,但我可以使用 Numpy 对象)。
【问题讨论】:
-
你也可以使用
np.linalg.norm(W-u) -
您是否在循环变量中添加了
cdef int v类型?如果没有,那可能会导致一些放缓。但是您对 cython 中的并行化是正确的;如果您在循环中触摸任何 python 对象,则不能使用像prange这样的 OpenMP 函数。无论如何,看起来您已经有了更智能的 python 解决方案! -
@CodeSurgeon 上面我只展示了 Python 版本以便于复制,但我会在 Cython 中适当地定义变量!
标签: python python-3.x performance numpy cython