【问题标题】:apply along axis using arrays as indicies使用数组作为索引沿轴应用
【发布时间】:2015-09-17 23:06:02
【问题描述】:

我正在尝试在没有循环的情况下就地执行此功能:

for i in xrange(2):
    trend[i] = np.convolve(dat[i,0], aW3[:,i], 'same').sum()

我最好的尝试如下:

trend[:2] = np.apply_along_axis(
    func1d=lambda x: np.convolve(x, aW3[:,i], 'same').sum(),
    axis=1,
    arr=dat[:2,0])

但我不知道如何正确索引 aW3[:,i] 到 func1d

使用的常量

aW3 = np.array( [[ 0.259,  0.407],
                 [ 0.37 ,  0.407],
                 [ 0.259,  0.185],
                 [ 0.111,  0.   ]])
dat = np.array([0.02360784,  0.0227628 ,  0.0386366 ,  0.03338596,  0.03141621, 0.03430469])
dat = dat.reshape(dat.shape[0], 1) # in columns

【问题讨论】:

  • 很难知道你要做什么,因为第一个循环没有真正意义......如果你打印出dat[i,0],你会发现它只是一个标量,所以你的卷积只是一个乘法。
  • 是的,我简化了一个更复杂的计算。我保留了这个函数,因为我想强调它不仅仅是一个乘法,我想要一个广义的函数解
  • 您的示例对您问题的具体点没有意义,使您的问题不清楚。我的猜测是scipy.ndimage.filters.convolve1d 可能会做你想做的事。
  • 谢谢,这可能会简化我的实际代码。我对上述的理论解决方案很感兴趣,以便学习

标签: python numpy indexing vectorization


【解决方案1】:
trend = np.fromiter((np.convolve(dat[i,0], aW3[:,i], 'same').sum() for i in xrange(2)), float)

【讨论】:

    【解决方案2】:

    看来你可以使用np.einsum 来解决vectorized 的问题,就像这样 -

    trend = np.einsum('i,ji->i',dat[0:aW3.shape[1],0],aW3)
    

    或者broadcasting -

    trend = (dat[0:aW3.shape[1],0]*aW3).sum(0)
    

    【讨论】:

    • 我不确定第二个是否可以使用函数而不是您使用的乘法。我喜欢第一个包含爱因斯坦符号的函数
    • @AlexanderMcFarlane 使用einsum 的第一种方法有效吗?如果是这样,那么第二种方法也必须有效,因为它在功能上与第一种方法相同。
    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多