python-3.x 列表求差的一种有效方法

hgncfbus  于 2023-03-09  发布在  Python
关注(0)|答案(2)|浏览(155)

我沿着一条直线移动一个粒子,然后用N来除这个轨迹,N是一个很大的数,然后我根据它的位置进行一些计算,并把这些计算结果存储在7个不同的列表中,整个过程大约需要0.03秒,这是很棒的。
但是,使用这些列表,我创建了差异列表,其中d_list的元素对于所有n都是list[n+1]-list[n]。

d_lists = [[np.abs(b-a) for a,b in zip(l, l[1:])] for l in lists]

当我这样做的时候,现在需要7.7秒,这比0.03秒要高得多。我试着减少时间,但是花了大约13秒。

d_lists = [[abs_diff for abs_diff in map(np.abs, zip(l, l[1:]))]

我很好奇是否有更好的方法来解决这个问题。我很难直观地理解为什么这个简单的任务要花很多时间。
我注意到的一件事是np.abs引起的,如果我用(b-a)代替np.abs(b-a),那么7.7秒会减少到1.2秒。

zpjtge22

zpjtge221#

您可以在numpy中使用diffabs完全完成此操作:

d_lists = np.abs(np.diff(lists))

这将给予一个数组,您可以使用以下命令将其转换回列表的列表(如果需要

d_lists = [list(l) for l in d_lists]
nbnkbykc

nbnkbykc2#

您是否尝试过np.diff

这就给了你数组中的连续差异,而不需要你当前的过程,即从一个标准的python结果b-a转换每个元组(a,B),然后运行一个numpy函数。

d_lists = [np.abs(np.diff(l)) for l in lists]

列表本身可以是numpy数组吗?

这可能会使它更快,Python本地变量与NumPy之间的每一次转换都可能会产生一点开销,而在当前的情况下,这种开销会被大量重复。

为了获得最大效率,您可以将所有列表存储在一个 single numpy数组中

我认为这是可能的,因为你似乎在说这7个列表实际上是平行的,即它们的长度相等。
如果是这样的话,那么你可以使用np.diff并指定你想要它沿着哪个“轴”进行比较。
https://numpy.org/doc/stable/reference/generated/numpy.diff.html

numpy.diff(a, n=1, axis=-1, prepend=<no value>, append=<no value>)

Calculate the n-th discrete difference along the given axis.

The first difference is given by out[i] = a[i+1] - a[i] along the 
given axis, higher differences are calculated by using diff 
recursively.

Parameters:

a, array_like, Input array

n, int, optional The number of times values are differenced. 

axis, int, optional The axis along which the difference is taken, default is the last axis.

相关问题