如何快速存储numpy对象(矩阵)?

Abh*_*tia 1 python performance numpy append matrix

我必须存储一个numpy矩阵列表.我尝试了两种方法:

1.创建并附list加到它:

ls_ws=[]
for ind in range(iterations):
    ...
    ls_ws.append(ls_w) # ls_w is a matrix of size 6,1
Run Code Online (Sandbox Code Playgroud)

问题:开始时速度很快,最后速度很慢.

2.创建一个零矩阵并修改它:

for ind in range(iterations):
    ...
    ls_ws=np.matrix(np.zeros((6,iterations))) 
Run Code Online (Sandbox Code Playgroud)

问题:我不太确定,但无论每次迭代如何,这似乎都是相同的速度.
我得到的奇怪的事情,如果我将迭代设置为较小的数字,它很快.但是,如果我将它设置为1500这样的大数,则每次迭代(即使是第一次迭代)都非常慢.


第二种方法应该很快,但如果我将迭代设置为大数,则速度非常慢.为什么?怎么解决?

Joh*_*nck 5

我认为你在这里几乎有一个很好的解决方案,但你对列与行的处理可能会影响性能:

ls_ws=np.matrix(np.zeros((6,iterations))) 
for ind in range(iterations):
    ...
    ls_ws[:,ind]=ls_w
Run Code Online (Sandbox Code Playgroud)

您应该在第一个维度而不是最后一个维度内进行迭代.您可以交换尺寸,或者只是这样做:

ls_ws=np.matrix(np.zeros((6,iterations), order='F')) 
Run Code Online (Sandbox Code Playgroud)

当数组很大时,这可能会有所帮助,因为您将访问6个元素的连续块,而不是每次迭代中的分散位.

  • 你的记忆是一维的,但可以处理二维数组.数组`np.array([[1,2,3],[4,5,6],[7,8,9]])`可以像`1 2 3 4 5 6 7 8 9`一样存储.是像C语言中那样的行专业(`order ='C'`),或者可以像`1 4 7 2 5 8 3 6 9那样存储,就像在Fortran中那样是专栏(`order ='F'`).参见例如[Wiki](https://en.wikipedia.org/wiki/Row-_and_column-major_order).就像在上面提到的答案中一样,访问内存中的连续位置更快. (2认同)