gpt4 book ai didi

python - 一维 np 数组 : how to make it more NumPy-thonic? 上切片的平均值

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:11 25 4
gpt4 key购买 nike

作为我正在运行的一些模拟的一部分,我需要最终对一些非常长的(实数)数字序列执行以下操作。这是要点:

给定一个长的一维 NumPy 数组,对于数组中的每个位置,我想对该位置前后的值进行平均,取平均值之间的差值,并将这些差值加载到另一个维度相同的 nparray 中原始数组。

这是我的尝试。它运行完美,只是随着序列变长,它变得 super 慢。

import numpy as np                                                                                     

def test_sequence(npseq):
n = npseq.shape[0]

def f(i):
pre = np.sum(npseq[:i])/i
post = np.sum(npseq[(i+1):])/(n-i)
return pre-post

out = np.array([f(i) for i in range(1,n)])

return out

看起来很简单。但是……

In [26]: a = np.random.randint(0,100,100000)
In [27]: %timeit example.test_sequence(a)
1 loops, best of 3: 7.69 s per loop

In [17]: a = np.random.randint(0,100,400000)
In [18]: %timeit example.test_sequence(a)
1 loops, best of 3: 1min 50s per loop

我知道可能有一种对此进行矢量化的聪明方法,但我对 NumPy 缺乏经验。谁能指出我正确的方向?

编辑:我最初写的是“sum”而不是“average”。我的意思是“平均”。我的错。而且我知道那里可能存在一个差一错误——我现在不关心它。实际问题比我在这里展示的版本稍微复杂一些,所以无论如何我都需要摆弄它。

最佳答案

这是使用 np.cumcum() 的一种方法:

np.cumsum(a[::-1])[::-1] - np.cumsum(a)

np.cumsum() 将生成前一项的总和,a[::-1])[::-1] 是后一项的总和.所以如果你想计算平均值,下一个项目的长度将是 np.arange(a.size, 1, -1) 而前一个项目的长度将是 np.arange (1, a.size) 所以你可以这样做:

np.cumsum(a[::-1])[::-1]/np.arange(a.size + 1, 1, -1) - np.cumsum(a)/np.arange(1, a.size + 1)

演示:

In [53]: a
Out[53]: array([32, 69, 79, 34, 1, 77, 54, 42, 73, 75])

In [54]: np.cumsum(a[::-1])[::-1]/np.arange(a.size + 1 , 1, -1) - np.cumsum(a)/np.arange(1, a.size + 1)
Out[54]:
array([ 16.72727273, -0.1 , -11.66666667, -9. ,
3. , 4.83333333, -0.62857143, -1. ,
-1.88888889, -16.1 ])

关于python - 一维 np 数组 : how to make it more NumPy-thonic? 上切片的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41839127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com