【发布时间】:2019-06-03 11:57:25
【问题描述】:
我想对我的 (6890,6890,3,3) numpy 数组中的每个 3x3 矩阵应用一个函数。到目前为止,我已经尝试在一个较小的示例中使用矢量化,并使用一个更简单的函数,但没有成功。
def myfunc(x):
return np.linalg.norm(x)
m = np.arange(45).reshape(5,3,3)
t = m.shape[0]
r = np.zeros((t, t))
q = m[:,None,...] @ m.swapaxes(1,2) # m[i] @ m[j].T
f = np.vectorize(q, otypes=[np.float])
res = myfunc(f)
矢量化甚至是有效解决此问题的正确方法还是我应该尝试其他方法?我也研究了numpy.apply_along_axis,但这仅适用于一维子数组。
【问题讨论】:
-
列出的
myfunc是您正在使用的实际功能吗? -
不,不是。这是实际的:
pyquaternion.Quaternion.log(pyquaternion.Quaternion(matrix=m)).norm -
如果你的函数只能使用 3x3 数组,那么调用 6890*6890 次是没有办法的。
-
np.vectorize 将很难应用,而且速度较慢。 `apply_along 并不容易。
-
np.vectorize有一个注释说它不承诺任何加速。此外,它通常将标量元素传递给您的函数,而您想要传递 2d 元素。它有一个signature模式可以做到这一点,但速度更慢。
标签: python arrays numpy vectorization