python - Numpy 数组与 Python 数组

标签 python arrays numpy

<分区>

我注意到 Python 中数组操作的事实上标准是通过出色的 numpy 库实现的。但是,我知道 Python 标准库有一个 array 模块,在我看来,它的用例与 Numpy 类似。

是否有任何真实世界的例子,其中 array 优于 numpy 或只是普通的 list

根据我天真的解释,array 只是同类数据的内存高效容器,但没有提供提高计算效率的方法。


编辑

出于好奇,我在 Github 和 import array 中搜索了 Python 命中 186'721 个计数,而 import numpy 命中了 8'062'678 个计数。

但是,我找不到使用array 的流行存储库。

最佳答案

为了理解 numpyarray 之间的区别,我进行了更多的定量测试。

我发现,对于我的系统(Ubuntu 18.04、Python3),arrayrange 生成器生成大型数组的速度似乎是原来的两倍与 numpy 相比(尽管 numpy 的专用 np.arange() 似乎快得多——实际上太快了,也许它是在测试期间缓存一些东西),但比使用 list 慢两倍。

但是,非常令人惊讶array 对象似乎比 numpy 对象更大。 相反,list 对象大约比 array 对象大 8-13%(这显然会随着单个项目的大小而变化)。 与 list 相比,array 提供了一种控制数字对象大小的方法。

因此,也许 array 唯一合理的用例实际上是当 numpy 不可用时。

为了完整性,这里是我用于测试的代码:

import numpy as np
import array
import sys

num = int(1e6)
num_i = 100
x = np.logspace(1, int(np.log10(num)), num_i).astype(int)

%timeit list(range(num))
# 10 loops, best of 3: 32.8 ms per loop

%timeit array.array('l', range(num))
# 10 loops, best of 3: 86.3 ms per loop

%timeit np.array(range(num), dtype=np.int64)
# 10 loops, best of 3: 180 ms per loop

%timeit np.arange(num, dtype=np.int64)
# 1000 loops, best of 3: 809 µs per loop


y_list = np.array([sys.getsizeof(list(range(x_i))) for x_i in x])
y_array = np.array([sys.getsizeof(array.array('l', range(x_i))) for x_i in x])
y_np = np.array([sys.getsizeof(np.array(range(x_i), dtype=np.int64)) for x_i in x])

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 6))
plt.plot(x, y_list, label='list')
plt.plot(x, y_array, label='array')
plt.plot(x, y_np, label='numpy')
plt.legend()
plt.show()

Plot of Object Sizes

关于python - Numpy 数组与 Python 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290791/

相关文章:

python - 设置详细的正则表达式

c++ - 数组嵌套代理

python - 假设 0 * infinity = 0,如何在 NumPy 中乘法 outer()?

python - 使用 PIL 将 RGB 图像变成纯黑白图像

python - Cartopy 使用正交投影错误地绘制点

python - Scrapy选择器有select()方法吗?

php - PHP 中数组的最大大小是多少?

c# - 将字符串数组排序为 Int

python - 包含大量数据的散点图

python - 在Python中访问数组中的几列