Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与常规Python列表相比,NumPy有哪些优势?_Python_Arrays_List_Numpy_Numpy Ndarray - Fatal编程技术网

与常规Python列表相比,NumPy有哪些优势?

与常规Python列表相比,NumPy有哪些优势?,python,arrays,list,numpy,numpy-ndarray,Python,Arrays,List,Numpy,Numpy Ndarray,与常规Python列表相比,它有哪些优点 我有大约100个金融市场系列,我将创建一个由100x100x100=100万个单元格组成的立方体阵列。我将用每个y和z对每个x进行回归(3变量),用标准误差填充数组 我听说对于“大型矩阵”,出于性能和可伸缩性的考虑,我应该使用NumPy而不是Python列表。问题是,我知道Python列表,它们似乎适合我 如果我搬到NumPy,会有什么好处 如果我有1000个系列(即多维数据集中的10亿个浮点单元),会怎么样 NumPy的数组比Python列表更紧凑——

与常规Python列表相比,它有哪些优点

我有大约100个金融市场系列,我将创建一个由100x100x100=100万个单元格组成的立方体阵列。我将用每个y和z对每个x进行回归(3变量),用标准误差填充数组

我听说对于“大型矩阵”,出于性能和可伸缩性的考虑,我应该使用NumPy而不是Python列表。问题是,我知道Python列表,它们似乎适合我

如果我搬到NumPy,会有什么好处


如果我有1000个系列(即多维数据集中的10亿个浮点单元),会怎么样

NumPy的数组比Python列表更紧凑——在Python中,您描述的列表列表至少需要20 MB左右,而单元格中带有单精度浮点的NumPy 3D数组则需要4 MB。使用NumPy读取和写入项目的速度也更快

也许你不太在乎一百万个单元,但你肯定会在乎十亿个单元——这两种方法都不适合32位体系结构,但对于64位构建,NumPy可以获得4GB左右的内存,光是Python就至少需要12GB(大量指针的大小是原来的两倍)——这是一个更昂贵的硬件


这种差异主要是由于“间接性”——Python列表是指向Python对象的指针数组,每个指针至少有4个字节,再加上即使是最小的Python对象也有16个字节(4个用于类型指针,4个用于引用计数,4个用于值——内存分配器最多可舍入16个)。NumPy数组是一个统一值的数组——单精度数字每个需要4个字节,双精度数字需要8个字节。灵活性较低,但您为标准Python列表的灵活性付出了巨大代价

NumPy不仅效率更高;它也更方便。你可以免费得到很多向量和矩阵运算,这有时可以避免不必要的工作。它们也得到了有效的实施

例如,您可以将多维数据集直接从文件读入数组:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
沿第二维度求和:

s = x.sum(axis=1)
x[:, :, ::2]
查找高于阈值的单元格:

(x > 0.5).nonzero()
沿第三维删除每个偶数索引切片:

s = x.sum(axis=1)
x[:, :, ::2]
此外,许多有用的库都使用NumPy数组。例如,统计分析和可视化库


即使没有性能问题,学习NumPy也是值得的。

Alex提到了内存效率,Roberto提到了便利性,这两个都是好的方面。关于更多的想法,我将提到速度功能

功能:你有很多内置的NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等,真的,谁能生活没有FFT

速度:这里有一个对列表和NumPy数组进行求和的测试,显示NumPy数组的求和速度快10倍(在这个测试中,里程数可能会有所不同)

在我的系统上(当我运行备份时)提供:


以下是网站上常见问题的一个很好的答案:

与(嵌套的)Python列表相比,NumPy数组有哪些优势?

Python的列表是高效的通用容器。他们支持 (相当)高效的插入、删除、追加和连接, Python的列表理解使它们易于构造和使用 操纵但是,它们有一定的局限性:它们不支持 “矢量化”操作,如元素加法和乘法, 它们可以包含不同类型的对象这一事实意味着 Python必须存储每个元素的类型信息,并且 对每个元件进行操作时,执行类型调度代码。这 也就是说,只有很少的列表操作可以由 高效的C循环——每次迭代都需要类型检查和其他检查 Python API簿记


所有这些都强调了numpy数组和python列表之间几乎所有的主要区别,我将在这里简要介绍它们:

  • Numpy数组在创建时具有固定的大小,这与python列表(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原始数组

  • Numpy数组中的元素都需要具有相同的数据类型(我们也可以具有异构类型,但这不允许进行数学运算),因此在内存中的大小相同

  • Numpy数组便于对大量数据执行数学和其他类型的操作。通常,与python内置序列相比,此类操作的执行效率更高,代码更少


  • 谢谢-您在第三个示例中提供了另一个很好的理由,因为事实上,我将在矩阵中搜索阈值以上的单元格。此外,我是从sqlLite加载的。文件方法将更加有效。我一直在尝试使用“sys.getsizeof()”来比较相同元素数的Python列表和NumPy数组的大小,但这似乎并不表明NumPy数组要小得多。是这样还是sys.getsizeof()在计算NumPy数组的大小时遇到问题?@JackSimpson
    getsizeof
    不可靠。文档清楚地表明:只考虑直接归因于对象的内存消耗,而不是它所指对象的内存消耗。这意味着,如果您有嵌套的python列表,则不考虑元素的大小。
    getsizeof
    列表上的内容只告诉您列表对象本身和其数据数组中指针所消耗的RAM,而不告诉您这些指针所指的对象所消耗的RAM。@AlexMartelli,你能告诉我你是从哪里得到这些数字的吗?只是提醒一下,你对这个数字的估计