gpt4 book ai didi

python 和 NumPy : sum of an array slice

转载 作者:太空狗 更新时间:2023-10-29 19:33:25 25 4
gpt4 key购买 nike

我有一个一维 numpy 数组 (array_) 和一个 Python 列表 (list_)。

以下代码有效,但效率低下,因为切片涉及不必要的副本(当然适用于 Python 列表,我相信也适用于 numpy 数组?):

result = sum(array_[1:])
result = sum(list_[1:])

重写它的好方法是什么?

最佳答案

切片 numpy 数组不会生成副本,就像在列表的情况下那样。

作为一个基本的例子:

import numpy as np
x = np.arange(100)
y = x[1:5]
y[:] = 1000
print x[:10]

这会产生:

[   0 1000 1000 1000 1000    5    6    7    8    9]

即使我们修改了 y 中的值,它也只是对与 x 相同的内存的一个 View 。

对 ndarray 进行切片会返回一个 View ,并且不会复制内存。

但是,在 numpy 数组上使用 array_[1:].sum() 而不是调用 python 的内置 sum 会更有效。

作为快速比较:

In [28]: x = np.arange(10000)

In [29]: %timeit x.sum()
100000 loops, best of 3: 10.2 us per loop

In [30]: %timeit sum(x)
100 loops, best of 3: 4.01 ms per loop

编辑:

对于列表,如果出于某种原因您不想制作副本,您始终可以使用 itertools.islice。而不是:

result = sum(some_list[1:])

你可以这样做:

result = sum(itertools.islice(some_list, 1, None))

不过,在大多数情况下,这是矫枉过正的。如果您处理列表的时间足够长以至于内存管理成为一个主要问题,那么您可能不应该使用列表来存储您的值。 (列表并非旨在或旨在将项目紧凑地存储在内存中。)

此外,您不会希望对 numpy 数组执行此操作。简单地执行 some_array[1:].sum() 将比 islice 快几个数量级并且不会使用 任何 更多的内存。

关于 python 和 NumPy : sum of an array slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5891523/

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