python:如果循环返回错误的结果

时间:2016-10-30 10:20:58

标签: python numpy if-statement

我编写了以下脚本,试图计算数组a中的部分并将结果堆叠到原始数组中:

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.          4.          4.555       0.33328455]
 [ 2.          3.          9.112       0.66671545]
 [ 3.          1.          7.322       0.65182943]
 [ 1.          5.          3.911       0.34817057]]

如何解决这个问题?是否有更有效的编码来完成这项任务?

1 个答案:

答案 0 :(得分:2)

没有 if loop 这样的东西。如果测试匹配,if语句将执行一个块,但只会执行一次。阻止结束时的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就会重复执行该块。

您也可以使用for循环,xrange()对象以2为增量递增:

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