在循环内的 Python 中附加一个矩阵

Posted

技术标签:

【中文标题】在循环内的 Python 中附加一个矩阵【英文标题】:Appending a Matrix in Python within loop 【发布时间】:2017-12-07 05:17:49 【问题描述】:

我有一个大小为 (3,3) 的矩阵 y。假设它是一个 3 x 3 矩阵,所有元素 = 1。

然后我有一个循环来创建多个 (3,3) 矩阵。 所以这些是输出:

第一个循环我得到这个矩阵:

 [[  88.    42.5    9. ]
 [ 121.5   76.    42.5]
 [ 167.   121.5   88. ]]

我得到的第二个循环:

 [[  88.    42.5   13. ]
 [ 117.5   72.    42.5]
 [ 163.   117.5   88. ]]

所以我想要实现的本质上是

 [[1, 1, 1] [88, 42.5, 9] [88, 42.5, 13],
 [1, 1, 1] [121.5, 76, 42.5] [117.5, 72, 42.5],
 [1, 1, 1] [167, 121.5, 88] [163, 117.5, 88]]

这是假设循环迭代两次,我不确定我是否将逗号或间距等放在了正确的位置,但理想情况下我获得了一个 3 x 3 矩阵,每个元素都有一个包含 3 个元素的列表。

到目前为止,我的循环代码是(Up_xyz,Mid_xyz,Down_xyz 以 [x,x,x] 格式输出):

for i in range (1,len(PeopleName)):       
  x = np.vstack((Up_xyz(TempName[i]),Mid_xyz(TempName[i]),Down_xyz(TempName[i])))
restA.append(x)
l+=1

结果:

   [array([[  88. ,   42.5,   13. ],
   [ 117.5,   72. ,   42.5],
   [ 163. ,  117.5,   88. ]])]

这只是循环最后一次迭代的值。

另外,当我将 y 附加到 restA 时

print(y.append(restA))

我收到此错误:

'numpy.ndarray' object has no attribute 'append'

我认为这是由于尺寸不同造成的。但我会很感激任何帮助,而且我对 Python 还很陌生,所以也愿意接受任何其他更有效的方法。谢谢

【问题讨论】:

如果你的数组中的元素是 Python 列表,为什么需要使用 numpy?你能只用 Python 列表吗 【参考方案1】:

它存在np.append,但是在循环中它非常昂贵(如果你一个一个附加)。见documentation:

带有附加到轴的值的 arr 副本。请注意,追加不会就地发生:分配并填充一个新数组。如果axis为None,则out为扁平数组。

循环的每个增量都会复制数组(这里只有 3 个增量,但我认为这样做不是一个好习惯,请注意)

好的,你有 3 个数组,你想合并每个数组:

import numpy as np

a = np.array([[ 1.,  1.,  1.],
              [ 1.,  1.,  1.],
              [ 1.,  1.,  1.]])

b = np.array([[  88.,    42.5,    9. ],
              [ 121.5,   76.,    42.5],
              [ 167.,  121.5,   88. ]])

c = np.array([[  88.,    42.5,   13. ],
              [ 117.5,   72.,    42.5],
              [ 163.,   117.5,  88. ]])

result = np.empty((3,3), dtype=object)

n, p = result.shape
for i in range(n):
      result[i, 0] = a[i,:]
      result[i, 1] = b[i,:]
      result[i, 2] = c[i,:]

print(result)

输出:

array([[array([ 1.,  1.,  1.]), array([ 88. ,  42.5,   9. ]), 
       array([ 88. ,  42.5,  13. ])],
       [array([ 1.,  1.,  1.]), array([ 121.5,   76. ,   42.5]),
        array([ 117.5,   72. ,   42.5])],
       [array([ 1.,  1.,  1.]), array([ 167. ,  121.5,   88. ]),
        array([ 163. ,  117.5,   88. ])]], dtype=object)

如果您想要list 而不是np.array,请执行以下操作:

n, p = result.shape
for i in range(n):
    result[i, 0] = a[i,:].tolist()
    result[i, 1] = b[i,:].tolist()
    result[i, 2] = c[i,:].tolist()

print(result)

输出:

[[[1.0, 1.0, 1.0] [88.0, 42.5, 9.0] [88.0, 42.5, 13.0]]
 [[1.0, 1.0, 1.0] [121.5, 76.0, 42.5] [117.5, 72.0, 42.5]]
 [[1.0, 1.0, 1.0] [167.0, 121.5, 88.0] [163.0, 117.5, 88.0]]]

每个元素都是一维数组的二维数组有点奇怪。

您可以直接使用 3D 数组 (3,3,3) 形状:

np.stack([a,b,c])

【讨论】:

但就我而言,我不知道将生成的矩阵数量,它可以是 2 或最多 30。由于您是单独为每个矩阵分配变量,我假设这个方法不适用于我的情况? 您可以循环添加任意数量的对象到列表中。 试试np.stack([a,b,c]) 这应该会创建一个形状 (3,3,3) 数组。【参考方案2】:

你应该在 for 循环中追加

for i in range (1,len(PeopleName)):       
    x = np.vstack((Up_xyz(TempName[i]),Mid_xyz(TempName[i]),Down_xyz(TempName[i])))
    restA.append(x)
l+=1

Numpy 数组对象没有方法 append。你可能想要:

y = np.append(y, restA)

【讨论】:

谢谢!第一部分有效,我应该早点抓住它。 y = np.append(y, restA) 部分最终创建了一个列向量。你有什么建议吗?这和轴有关吗?

以上是关于在循环内的 Python 中附加一个矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cupy 将数组附加到矩阵

通过循环内的条件更改附加的 td

将循环迭代的矩阵保存在一个矩阵中

使用变量作为列表名称附加到循环内的列表

Python:返回特定范围内的矩阵值,范围以元组形式给出(从,到)

将每个 seaborn 图形附加到 for 循环内的 PDF