2017-07-03 97 views
3

我有一個矩陣大小(3,3)。假設它是一個3乘3矩陣,所有元素都等於1.在循環中在Python中追加矩陣

然後我有一個循環來創建多個(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]] 

這是假設循環迭代兩次,我不知道如果我有pl在適當的地方加上逗號或間距等,但理想情況下,我得到一個3×3的矩陣,每個元素都有一個3個元素的列表。

我的代碼我迄今爲止爲循環是(Up_xyz,Mid_xyz,在[X,X,X]格式Down_xyz輸出):

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以雷斯塔與

print(y.append(restA)) 

我得到這個錯誤:

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

我認爲這是由於尺寸的差異。但是,如果有任何幫助,我將不勝感激,而且我對Python相當陌生,所以可以採用任何其他更有效的方式。由於

+0

如果你的數組中的元素是Python列表,你爲什麼需要使用numpy的?你可以通過Python列表獲得 – wwii

回答

1

你應該內追加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的數組對象沒有一個方法追加。你可能會想:

y = np.append(y, restA) 
+0

謝謝!第一部分的工作,我應該早些抓住了。 'y = np.append(y,restA)'部分最終創建了一個列向量。你有什麼建議嗎?這與軸有關嗎? – Questions

2

它存在np.append,但它是在一個循環中非常昂貴的(如果你通過一個附加一個)。見documentation

A copy of arr with values appended to axis. Note that append does not occur in-place: a new array is allocated and filled. If axis is None, out is a flattened array.

副本,該陣列用於你的循環的每個增量完成(這裏僅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) 

如果你想要的,而不是listnp.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]) 
+0

但是對於我的情況,我不知道將要生成的矩陣的數量,它可以是2或多達30個。由於您將變量單獨分配給每個矩陣,我認爲這種方法不適用於我的情況? – Questions

+0

您可以在循環中追加任意數量的對象以列出。 – hpaulj

+0

嘗試'np.stack([a,b,c])'這應該創建一個形狀(3,3,3)數組。 – hpaulj