numpy.sort()error ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

时间:2015-05-06 06:38:54

标签: python sorting numpy

当我使用 numpy 对数组进行排序时 这个问题出现了:

Traceback (most recent call last):
File "D:/Desktop/LIP/complier/num/f_t.py", line 75, in <module>
frogs[i].sort(order='length')
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

但如果我评论这些代码,那就没关系

        # if len < temp_len:
        #     r_w[i]['length'] = len
        # else:
        #     r_w[i]['points'] = r_g['points']
        #     r_w[i]['length'] = r_g['length']

为什么?

r_g是最佳路线,r_w是每个群组中最差的路线,r_b是每个群组中的最佳路线。 我想在一个循环中改变最差路线5次。

以下是代码:

# -*- coding: utf-8 -*- 
# __author__ = 'youzipi'
import numpy as np

def cal_length(route):
    length = 0
    for i in range(POINTS_NUM):
        p1 = points[route[i]]
        p2 = points[route[(i + 1) % POINTS_NUM]]
        length += np.linalg.norm(p1 - p2)
    return length

POINTS_NUM = 10
ROUTES_NUM = 50
routetype = np.dtype({
    'names': ['points', 'length'],
    'formats': ['O', 'f']})
routes = np.zeros([(ROUTES_NUM)], dtype=routetype)
points = np.random.rand(POINTS_NUM, 2) * 10
print "points=", points

for index in range(ROUTES_NUM):
    temp = np.random.permutation(range(POINTS_NUM))
    length = cal_length(temp)
    routes[index] = (temp, length)


print "after sort"
routes.sort(order=('length'))
print routes
frogs = np.zeros([5, 10], dtype=routetype)

for i in range(5):
    t = 0
    for j in range(ROUTES_NUM):
        if j%5 == i:
            frogs[i][j/5]['points'] = routes[j]['points']
            frogs[i][j/5]['length'] = routes[j]['length']

for i in range(5):
    print "frogs", i
    print frogs[i]
p = routes['length']
print p
r_g = routes[0]
print "r_g", r_g
r_b = frogs[:, 0]
print "r_b", r_b
r_w = frogs[:, 9]
print "r_w", r_w


#def update_frogs():
#global r_w, r_b, r_b
for i in range(5):
    for j in range(5):
        cut = int(np.random.rand(1)[0] * 10)
        ran = np.random.permutation(range(POINTS_NUM))
        print 'r_w', r_w[i]
        print 'r_b', r_b[i]
        temp_len = r_w[i]['length']
        r_w[i]['points'] = np.hstack((r_b[i]['points'][:cut], np.linspace(-1, -1, 10)[cut:]))
        for t in ran:
            if t not in r_w[i]['points']:
                r_w[i]['points'][cut] = t
                cut = cut + 1
            if cut >= POINTS_NUM:
                break
        len = cal_length(r_w[i]['points'])
        # if len < temp_len:
        #     r_w[i]['length'] = len
        # else:
        #     r_w[i]['points'] = r_g['points']
        #     r_w[i]['length'] = r_g['length']
        frogs[i].sort(order='length')#trackbreak here!!
        r_w[i]['points'] = frogs[i, 9]['points']
        r_w[i]['length'] = frogs[i, 9]['length']
        print "after"
        print 'f_w', r_w[i]
        print 'f_b', r_b[i]

1 个答案:

答案 0 :(得分:1)

查看相关的&#39;专栏 - 关于此ValueError有很多问题。

最可能的原因是您生成True / False值的列表或数组,然后尝试在Python if/else上下文中使用它。

因此,我不会动手并分析您的所有代码,而是建议您查看这些问题行中的变量,并确定哪些代码生成多个值。实际上,由于只有if语句,它必须是len < temp_len。这两个变量中的其他或另一个是数组,而不是标量。

    # if len < temp_len:
    #     r_w[i]['length'] = len
    # else:
    #     r_w[i]['points'] = r_g['points']
    #     r_w[i]['length'] = r_g['length']