我编写了以下脚本,试图计算数组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]]
如何解决这个问题?是否有更有效的编码来完成这项任务?
答案 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]]