我有一个 numpy 数组,比方说,[a,b,c,d,e,...]
,我想计算一个看起来像 [x *a+y*b, x*b+y*c, x*c+y*d,...]
。我的想法是首先将原始数组拆分成类似 [[a,b],[b,c],[c,d],[d,e],...]
然后用指定轴和权重的 np.average
攻击这个生物(在我的例子中是 x+y=1
),或者甚至使用 np.dot
。不幸的是,我不知道如何创建这样的 [a,b],[b,c],...
对数组。非常感谢任何帮助,甚至是完成主要任务的完全不同的想法:-)
最佳答案
最快、最简单的方法是手动提取数组的两个切片并将它们加在一起:
>>> arr = np.arange(5)
>>> x, y = 10, 1
>>> x*arr[:-1] + y*arr[1:]
array([ 1, 12, 23, 34])
如果您想将其概括为三元组、四元组,这将变得很痛苦……但是您可以使用 as_strided
以更通用的形式从原始数组创建对数组:
>>> from numpy.lib.stride_tricks import as_strided
>>> arr_pairs = as_strided(arr, shape=(len(arr)-2+1,2), strides=arr.strides*2)
>>> arr_pairs
array([[0, 1],
[1, 2],
[2, 3],
[3, 4]])
当然,使用 as_strided
的好处在于,就像数组切片一样,不涉及数据复制,只是扰乱了内存的查看方式,所以创建这个数组实际上是无成本。
现在可能最快的方法是使用 np.dot
:
>>> xy = [x, y]
>>> np.dot(arr_pairs, xy)
array([ 1, 12, 23, 34])
关于python - 带有权重的 numpy 数组部分和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20162578/