【问题标题】:Lazy evaluation of numpy.maxnumpy.max 的懒惰评估
【发布时间】: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


【解决方案1】:

您可以使用np.where 查找非零索引。例如(m=3n=6):

x= np.array([1,0,0,2,3,1])
Y = np.array([[1,2,3,4,5,6],
              [4,5,6,1,2,3],
              [7,8,9,4,5,1]])
ind = np.where(x != 0)[0]
result = sum(x[ind]*np.max(Y[:,ind], axis=0))
print (result)

输出

36.0

【讨论】:

  • 现在你需要做一些时间来确定什么时候更快!
  • 我将其作为 OP 的任务,并在此处发布结果以供所有人参考。
猜你喜欢
  • 1970-01-01
  • 2015-09-06
  • 2016-12-14
  • 2021-12-25
  • 2018-04-01
  • 2018-03-31
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
相关资源
最近更新 更多