在循环内的 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 中附加一个矩阵的主要内容,如果未能解决你的问题,请参考以下文章