【发布时间】:2023-03-30 09:48:01
【问题描述】:
我希望解决的实际问题是,给定一组 N 个单位向量和另一组 M 个向量,计算每个单位向量的平均值它与每个 M 向量的点积的绝对值。本质上,这是计算两个矩阵的外积,然后用介于两者之间的绝对值求和和平均。
对于不太大的 N 和 M 这并不难,并且有很多方法可以继续(见下文)。问题是当 N 和 M 很大时,创建的临时变量很大,并为所提供的方法提供了实际限制。可以在不创建临时对象的情况下完成此计算吗?我遇到的主要困难是由于绝对值的存在。是否有用于“线程化”此类计算的通用技术?
以下面的代码为例
N = 7
M = 5
# Create the unit vectors, just so we have some examples,
# this is not meant to be elegant
phi = np.random.rand(N)*2*np.pi
ctheta = np.random.rand(N)*2 - 1
stheta = np.sqrt(1-ctheta**2)
nhat = np.array([stheta*np.cos(phi), stheta*np.sin(phi), ctheta]).T
# Create the other vectors
m = np.random.rand(M,3)
# Calculate the quantity we desire, here using broadcasting.
S = np.average(np.abs(np.sum(nhat*m[:,np.newaxis,:], axis=-1)), axis=0)
这很好,S 现在是一个长度为 N 的数组,并包含所需的结果。不幸的是,在这个过程中,我们创建了一些潜在的巨大数组。结果
np.sum(nhat*m[:,np.newaxis,:], axis=-1)
是一个 M X N 数组。当然,最终结果的大小只有 N。开始增加 N 和 M 的大小,我们很快就会遇到内存错误。
如上所述,如果不需要绝对值,那么我们可以如下进行,现在使用einsum()
T = np.einsum('ik,jk,j', nhat, m, np.ones(M)) / M
即使对于相当大的 N 和 M ,这也可以快速运行。对于具体问题,我需要包含abs(),但更通用的解决方案(也许是更通用的 ufunc)也很有趣。
【问题讨论】:
标签: python optimization numpy