2017-07-03 2 views
3

私は、サイズが(3,3)のyの行列を持っています。すべての要素が1である3行3列の行列であるとします。ループ内の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]] 

これは、ループが2回繰り返されると仮定しています。私がplを持っているかどうかわかりませんコンマやスペースなどを適切な場所に置いてください。理想的には、3つの要素を持つリストを持つ各要素を持つ3行3列の行列を取得します。

私はこれまで持っている

マイコードforループである(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. ]])] 

これは単純にループの最後の反復からの値です。私は

print(y.append(restA)) 

でレスタにYを追加また

、私はこのエラーを取得:

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

を私は、これはサイズの違いによるものであると仮定します。しかし、私はどんな助けにも感謝しています。私はPythonをかなり新しくしているので、他の方法でも効率的です。おかげ

+0

あなたが直接3D配列(3,3,3)と形状を持つことができますか?あなたはちょうど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の配列オブジェクトは、このメソッドはappendを持っていません。あなたはお勧めします:

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.

Aが

OK(、注意して、それが唯一の3刻みで、ここで私は、それを行うには良い方法ではありませんだと思う)配列が、あなたのループの各増分のために行われているコピーあなたは3つの配列を持っている、とあなたがそれぞれ1をマージしたい:

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]]] 

それは、それぞれの要素が1次元配列で2次元配列を持つように少し奇妙です。あなたがnumpyの使用する必要がない理由、あなたの配列内の要素は、Pythonのリストである場合

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

私の場合は、生成される行列の数はわかりませんが、2または30までです。個々の行列に変数を個別に割り当てているので、このメソッドは私の場合には役に立たないと思いますか? – Questions

+0

リストにはループ内で任意の数のオブジェクトを追加できます。 – hpaulj

+0

'np.stack([a、b、c])'これは形状(3,3,3)の配列を作成するはずです。 – hpaulj

関連する問題