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

Posted

技术标签:

【中文标题】Python:如何在不扩展矩阵的情况下增加矩阵的维度?【英文标题】:Python: How to increase the dimensions of a matrix without expanding it? 【发布时间】:2018-01-18 07:49:20 【问题描述】:

我是 Python 的新手,目前正在编写一个代码,我想在其中存储 3 维矩阵的先前迭代,其版本是在 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 时将其转换为四维形式。

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

【问题讨论】:

docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html 【参考方案1】:

您可以考虑使用np.reshape。特别是,在将矩阵传递给函数时,您将像这样重塑它:

your_function(matrix.reshape(1, *matrix.shape))

matrix.shape 打印出矩阵的现有维度。

【讨论】:

【参考方案2】:

回答您的问题:添加长度为 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

【讨论】:

以上是关于Python:如何在不扩展矩阵的情况下增加矩阵的维度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用附加包的情况下绘制二进制矩阵?

如何在不创建数组的情况下使用 NgFor 来生成矩阵 UI 模式

matlab中如何对一个矩阵扩展下啊?

我们可以在不运行校准代码的情况下找到相机矩阵吗?

在不循环 c++ 的情况下对 2D 数组进行分区

为啥一个矩阵的行空间和列空间的维相同