2016-10-30 16 views
-1

を返した場合、私は、配列aに部分を計算し、元の配列に結果をスタックしようとすると、次のスクリプトを書いた:のpython:ループが間違った結果

import numpy 


a = numpy.array([[1, 4, 4.555], 
       [2, 3, 9.112], 
       [3, 1, 7.322], 
       [1, 5, 3.911]]) 

i = 0 
b = numpy.ones((4,1)) 
if i <= 2: 
    b[i][0] = float(a[i][2])/(a[i][2]+a[i+1][2]) 
    b[i+1][0] = float(a[i+1][2])/(a[i][2]+a[i+1][2]) 
    i = i+2 
print b 
c = numpy.hstack((a,b)) 
print c 

をしかし、結果は奇妙だった:

array b: 
[[ 0.33328455] 
[ 0.66671545] 
[ 1.  ] 
[ 1.  ]] 
array c: 
[[ 1.   4.   4.555  0.33328455] 
[ 2.   3.   9.112  0.66671545] 
[ 3.   1.   7.322  1.  ] 
[ 1.   5.   3.911  1.  ]] 

配列cの1行目と2行目は私が望むものでしたが、残りの行は奇妙でした。私が期待した結果の配列は:

[[ 1.   4.   4.555  0.33328455] 
[ 2.   3.   9.112  0.66671545] 
[ 3.   1.   7.322  0.65182943] 
[ 1.   5.   3.911  0.34817057]] 

これを修正するには?そして、このタスクを実行するためのより効率的なコーディングがありますか?

+4

だから何ですあなたの*予想*出力?あなたはループ*を持っていないことに注意してください。あなたは 'if'文しか持っていません。コードはそこで繰り返されません。おそらく 'while i <= 2:'ループを使うことを意味しましたか? –

答えて

2

ループの場合は、というようなものはありません。 ifステートメントは、テストが一致した場合にブロックを実行しますが、を1回だけ実行します。。ブロックの最後にあるi = i+2ステートメントは、コードを繰り返すことはありません。おそらくそこwhileループたかっ

:繰り返し

while i <= 2: 
    b[i][0] = float(a[i][2])/(a[i][2] + a[i+1][2]) 
    b[i+1][0] = float(a[i+1][2])/(a[i][2] + a[i+1][2]) 
    i += 2 

whileは限りテストが真であるとしてブロックを実行します。

あなたは2のステップでインクリメントxrange()オブジェクトと、あまりにもforループを使用することができます。期待される出力をループすることにより、

for i in xrange(0, len(b), 2): 
    b[i][0] = float(a[i][2])/(a[i][2] + a[i+1][2]) 
    b[i+1][0] = float(a[i+1][2])/(a[i][2] + a[i+1][2]) 

どちらの方法が生成されます

[[ 1.   4.   4.555  0.33328455] 
[ 2.   3.   9.112  0.66671545] 
[ 3.   1.   7.322  0.65182943] 
[ 1.   5.   3.911  0.34817057]] 
+0

ありがとうございました。部分bを作成するために配列bを作成する別の方法がありますが、最初はnumpyのものにしますか? – Heinz

+0

私はそれについて答えるためにnumpyまたはあなたの問題さえ十分に知らない。 –