Python numpy数组vs列表

mat*_*ots 11 python arrays numpy list

我需要对一大堆数字进行一些计算.

array.array或numpy.array是否比典型的数组提供显着的性能提升?

我不需要对数组进行复杂的操作,我只需要能够访问和修改值,

例如

import numpy
x = numpy.array([0] * 1000000)
for i in range(1,len(x)):
  x[i] = x[i-1] + i
Run Code Online (Sandbox Code Playgroud)

所以我真的不需要连接,切片等.

此外,如果我尝试分配不适合C long的值,则看起来像数组会抛出错误:

import numpy
a = numpy.array([0])
a[0] += 1232234234234324353453453
print(a)
Run Code Online (Sandbox Code Playgroud)

在控制台我得到:

a[0] += 1232234234234324353453453
OverflowError: Python int too large to convert to C long
Run Code Online (Sandbox Code Playgroud)

是否有一个变量的数组让我放入无界的Python整数?或者这样做会在一开始就消除阵列的重点?

Meh*_*dad 12

首先需要了解数组和列表之间的区别.

数组是由某种类型的元素组成的连续内存块(例如整数).

创建数组后,无法更改数组的大小.
因此,数组中的每个整数元素具有固定大小,例如4个字节.

另一方面,列表仅仅是地址的"数组" (也具有固定的大小).

但是然后每个元素在内存中保存其他内容的地址,这是您想要使用的实际整数.当然,这个整数的大小与数组的大小无关.因此,您始终可以创建一个新的(更大的)整数并"替换"旧的整数,而不会影响数组的大小,而数组只保存整数的地址.

当然,这种便利的清单是有代价的:在整数执行算术,现在需要一个内存访问阵列,再加以整数本身的内存访问,再加上它需要分配更多的内存(如果需要)的时间,加上删除旧整数所需的时间(如果需要).所以是的,它可能会更慢,所以你必须要小心你正在对数组中的每个整数做什么.


jfs*_*jfs 8

你的第一个例子可能是加速.Python循环和对numpy数组中各个项的访问速度很慢.使用矢量化操作:

import numpy as np
x = np.arange(1000000).cumsum()
Run Code Online (Sandbox Code Playgroud)

你可以将无界的Python整数放到numpy数组中:

a = np.array([0], dtype=object)
a[0] += 1232234234234324353453453
Run Code Online (Sandbox Code Playgroud)

在这种情况下,与固定大小的C整数相比较的算术运算会更慢.


Dee*_*ran 5

对于大多数用途,列表很有用。例如,有时使用 numpy 数组可能更方便。

a=[1,2,3,4,5,6,7,8,9,10]

b=[5,8,9]
Run Code Online (Sandbox Code Playgroud)

考虑一个列表“a”,如果您想访问列表“b”中给出的离散索引处的列表中的元素

a[b]
Run Code Online (Sandbox Code Playgroud)

不管用。

但是当您将它们用作数组时,您可以简单地编写

a[b]
Run Code Online (Sandbox Code Playgroud)

将输出作为数组([6,9,10])。