3

When I use numpy to sort an array this problem come up :

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()

But if I comment these codes,it is ok

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

Why?

r_g is the best route,r_w are the worst routes in every group,r_b is the best route in every group. I want to change the worst route for 5 times in a loop.

Here is the code:

# -*- 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]
5
  • 1
    you shouldn't use len as a name for one of your variables. it's a built-in function. Commented May 6, 2015 at 7:26
  • frogs is a set of groups for example:routes = [1,2,3,4,5,6],frogs=[[1,4],[2,5],[3,6]] Commented May 6, 2015 at 7:46
  • frogs is an numpy.array Commented May 6, 2015 at 7:52
  • ah, sorry, i missed that you included the code where you define frogs. Commented May 6, 2015 at 8:01
  • There are lots of SO questions about this error message. Commented May 6, 2015 at 13:59

1 Answer 1

1

Look at the 'related' column - there are lots of questions about this ValueError.

The most likely cause is that you generate a list or array of True/False values and then try to use it in a Python if/else context.

So instead of holding your hand and analyzing all of your code, I'm going to suggest that you look at the variables in the those problem lines, and determine which are generating multiple values. Actually, since there is only on if statement, it has to be len < temp_len. Other or other of those 2 variables is a array, not a scalar.

    # if len < temp_len:
    #     r_w[i]['length'] = len
    # else:
    #     r_w[i]['points'] = r_g['points']
    #     r_w[i]['length'] = r_g['length']
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.