numpy 使用核的乘法

eni9jsuy  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

给定数组

B = array([1, 1, 2, 3, 3])

字符串
我希望能够使用内核[1.0,-5.0,1.0]对前3个数字求和,然后取平均值。(1(1.0)-5(2)+1(2))/3.0 = -0.67等。第一个和最后一个元素保留,但用于相乘。
结果将是这样的:

result = np.array([1.0, -0.67, -2.0, -3.33, 3.0]).


我想要一个没有循环的有效方法。谢谢

zaqlnxep

zaqlnxep1#

您可以使用卷积(np.convolve)并除以内核的长度来获得中间元素:

B = np.array([1, 1, 2, 3, 3])
kernel = np.array([1.0, -5.0, 1.0])

tmp = np.convolve(B, kernel[::-1], mode='valid')/len(kernel)

字符串

  • 注意:卷积使用的是内核的反方向,所以如果它不是对称的,请确保将其反转。

或者使用sliding_window_view

from numpy.lib.stride_tricks import sliding_window_view as swv

tmp = (swv(B, len(kernel))*kernel).mean(axis=1)


输出量:

array([-0.66666667, -2.        , -3.33333333])


然后连接第一个和最后一个元素,或者替换数组副本中的中间部分。

result = B.copy().astype(float)

start = len(kernel)//2
result[start:start+len(kernel)] = tmp


输出量:

array([ 1.        , -0.66666667, -2.        , -3.33333333,  3.        ])

相关问题