我是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时才将其转换为四维形式。
有没有办法促进这种转换?
答案 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