【发布时间】:2019-01-07 01:29:41
【问题描述】:
假设我有一个形状为(n,) 的一维numpy 数组x 主要由零组成,以及一个形状为(m,n) 的二维数组Y。我要计算
np.sum(x * np.max(Y,axis=0))
即x 与矩阵 Y 的点积通过取每列的最大值来展平。如果这些数组很大并且x 主要由零组成,大概我正在做很多浪费的max 操作。
有没有办法以惰性方式进行计算,以便只计算非零值的最大值?我正在寻找一种优雅的方式——显然,我可以编写一个 for 循环并检查零值。
【问题讨论】:
-
不确定和函数式编程有关,但是
0*NaN=NaN,0*Infinity=NaN,0*-1=-0 -
关于唯一有可能提高速度的方法是使用
mask=x!=0选择Y的列或行以进行进一步处理。我还没有计算出你的尺寸,看看这是否可行。 -
np.max(Y,1)的形状为 (m,)。*是 (n,) 形状的x? -
我认为@hpaulj 有一个好主意。以下是如何实现它:
np.sum(x[mask]*np.max(Y[mask, :], axis=1))。但是您需要在实际数据上对其进行测试,看看它是否真的更快。
标签: python numpy functional-programming lazy-evaluation