Python:如何在不扩展矩阵的情况下增加矩阵的尺寸?

时间:2017-08-10 07:36:19

标签: python arrays python-3.x numpy concatenation

我是Python的新手,我目前正在编写一个代码,我想在其中存储三维矩阵的先前迭代,其中一个版本在for循环的每个步骤中创建。我想要解决这个问题的方法是连接一个新的维数3 + 1 = 4,它存储以前的值。现在这可以连接,我得到这样的工作:

import numpy as np

matrix = np.ones((1,lay,row,col), dtype=np.float32)

for n in range(100):
    if n == 0:
        # initialize the storage matrix
        matrix_stored = matrix
    else:
        # append further matrices in first dimension
        matrix_stored = np.concatenate((matrix_stored,matrix),axis = 0)

所以这里是我的问题:上面的代码要求矩阵已经是四维结构[1 x m x n x o]。然而,就我的目的而言,我宁愿将变量矩阵保持为三维[m x n x o],并且只有在将其输入变量matrix_stored时才将其转换为四维形式。

有没有办法促进这种转换?

1 个答案:

答案 0 :(得分:1)

回答您的问题:添加长度为1的维度的简写方法是使用None进行索引

np.concatenate((matrix_stored,matrix[None]),axis = 0)

但最重要的是我想警告你不要在循环中连接数组。比较这些时间:

In [31]: %%timeit
    ...: a = np.ones((1,1000))
    ...: A = a.copy()
    ...: for i in range(1000):
    ...:     A = np.concatenate((A, a))
1 loop, best of 3: 1.76 s per loop

In [32]: %timeit a = np.ones((1000,1000))
100 loops, best of 3: 3.02 ms per loop

这是因为concatenate将源数组中的数据复制到一个全新的数组中。并且循环的每次迭代都需要复制越来越多的数据。

提前分配更好:

In [33]: %%timeit
    ...: A = np.empty((1000, 1000))
    ...: a = np.ones((1,1000))
    ...: for i in range(1000):
    ...:     A[i] = a
100 loops, best of 3: 3.42 ms per loop