gpt4 book ai didi

python - Numpy - 将 numpy 函数转换为生成器

转载 作者:行者123 更新时间:2023-12-01 03:31:38 24 4
gpt4 key购买 nike

我有一个 numpy 函数,它将 x,y 坐标的二维数组转换为每个坐标之间的距离的平面数组。 (参见Numpy - transform 2D array of x,y coordinates into flat array of distance between coordinates)

input = [[-8081441,5685214], [-8081446,5685216], [-8081442,5685219], [-8081440,5685211], [-8081441,5685214]]
output = [-8081441, 5685214, 5, -2, -4, -3, -2, 8, 1, -3]

感谢Divakar's answer ,我有两个 numpy 函数正在做我想做的事情

arr = np.asarray(input).astype(int)
np.hstack((arr[0], (-np.diff(arr, axis=0)).ravel()))

另一种通过切片复制差异的方法 -

arr = np.asarray(input).astype(int)
np.hstack((arr[0], (arr[:-1,:] - arr[1:,:]).ravel()))

我的问题,有没有办法将这些 numpy 函数之一转置为生成器以提高性能?是否可以在生成器中使用 numpy?

最佳答案

Python 生成器是列表的衍生产品。

In [207]: [i*2 for i in range(3)]
Out[207]: [0, 2, 4]
In [208]: (i*2 for i in range(3))
Out[208]: <generator object <genexpr> at 0xb6a1ffbc>
In [209]: list(_)
Out[209]: [0, 2, 4]

您可以将其视为一个惰性列表。在您迭代它之前,它实际上不会评估元素。在 Py3 中,range 是一个生成器(在 Py2 中,xrange)。 In[208] 行设置了一个生成器,但不评估任何内容。所以它很快。但在[209]中对其进行迭代所花费的时间与[207]中的原始迭代一样长。 (嗯,可能会有细微的差别。)

因此,生成器可以让您像处理列表一样分块思考,而无需创建所有中间列表。它更像是一种代码组织工具,而不是性能工具。

在使用 numpy 数组时,我想不出任何等效的东西。

arr=np.array(input)  # creates fixed size array from input list
-np.diff(arr, axis=0) # create another array

这会创建许多中间数组,甚至是一个列表,并最终返回一个数组(并丢弃中间数组):

np.hstack((arr[0],(-np.diff(arr, axis=0)).ravel()))

该表达式中有许多简单的构建 block 。 Numpy 的速度来自于在快速编译的代码中执行这些步骤。为了获得更好的速度,您必须用 C 或 Cython 重写问题。在该代码中,您可以迭代并在每一步执行复杂的操作。

可以想象,numpy 可以执行某种惰性求值,但这需要大量的低级编码。并且不能保证它会带来性能改进。

我研究了中间缓冲区的问题,以及 add.at 是否提高了性能(没有):https://stackoverflow.com/a/40688879/901925

关于python - Numpy - 将 numpy 函数转换为生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896904/

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