【问题标题】:define a matrix which does not know one dimension beforehand定义一个事先不知道一维的矩阵
【发布时间】:2018-04-15 18:08:37
【问题描述】:

在一个程序中,我需要创建一个matrix,它可以是形状,例如matrix.shape(x,100)。形状的第一个维度无法事先知道,所以我这里只使用X。在一次迭代中,程序将生成一维数组,例如“Y.shape = (100,1)”。所以程序是这样工作的

 matrix = []
 index = 0
 for i in range(XY):
    if something 
       matrix[index,:] = Y
       index = index+1

我不确定是否可以通过这种方式初始化matrix,并且在如上所示的某些迭代中分配matrix{index,:]=Y 时是否需要重塑Y

【问题讨论】:

  • 什么是XY?你能提供一些带有小数组的工作代码吗?
  • i 在哪里使用?

标签: python numpy scipy


【解决方案1】:

您不能创建维度未知的numpy 数组。但是尽管有这个名字,你的 matrix 不是一个数组,它是一个 python 列表:

In [1]: alist = []
In [2]: for i in range(3):
   ...:     alist.append(np.arange(4)[:,None])
   ...:     
In [3]: alist
Out[3]: 
[array([[0],
        [1],
        [2],
        [3]]), array([[0],
        [1],
        [2],
        [3]]), array([[0],
        [1],
        [2],
        [3]])]
In [4]: np.concatenate(alist, axis=1)
Out[4]: 
array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])

您可以有效地将对象附加到列表中。一旦填充该列表,就可以将其转换为数组。在这里,因为元素是 (n,1),所以我选择了连接来制作一个 (4,3) 数组。但是可以使用np.arraynp.stack 或其他轴。

广泛推荐这种附加到列表并在迭代后一次调用生成数组的基本思想。

matrix[i,:] = Y 仅在 matrix 足够大时才有效。它不会“增长”矩阵(与 MATLAB 和 Javascript 实践相反)。您可以迭代地将一个数组连接到另一个数组,但效率较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2013-11-10
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多