Mam listę tablic, takich jak:
a = [array([6,2]),array([8,3]),array([4,2])]
próbowałem max(a)
który zwraca następujący błąd:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Chcę, aby zwrócił listę lub tablicę, taką jak:
In: max(a)
Out: [8,3]
Nie chcę konwertować wewnętrznych tablic do listy, ponieważ rozmiar listy jest bardzo duży, a także celowo stworzyłem tak, aby wykonywać operacje tablicowe.
Odpowiedzi:
3 dla odpowiedzi № 1Najprostszym sposobem jest konwersja na krotkę / listy w celu porównania (lub samodzielne wdrożenie porównania):
>>> max(a, key=tuple)
array([8, 3])
Zauważ, że jest to wbudowany max
i nie np.max
EDYTOWAĆ:
W przypadku tablic wielowymiarowych użyj .tolist
metoda:
max(a, key=operator.methodcaller("tolist"))
2 dla odpowiedzi nr 2
Definiowanie wartości max na tablicach jest, jak mówi wyjątek, niejednoznaczne. Jeśli mamy następujące tablice: [6, 2]
, [5, 1]
, więc myślę, że wyjście powinno być [6, 2]
, ale jeśli mamy następujący przykład: [6, 2]
, [7, 1]
co wtedy musiałoby być wyjście.
W rzeczywistości istnieje tak wiele różnych definicjimax tutaj. Jeśli weźmiemy tablice za wektory, to max może być ich wielkością lub wektorem o maksymalnej współrzędnej x itd. Max może równie dobrze porównać długość tablic na liście i zwrócić tę z większą liczbą elementów w przypadku krawata pierwsza z tych o tej samej długości.
Moją sugestią jest stworzenie klasy abstrakcyjnej dla struktur tablicowych i zdefiniowanie tam maksymalnej operacji z dokładnie takim wynikiem, jakiego oczekujesz.
0 dla odpowiedzi № 3
python 3.2
a=[([6,2]),([8,3]),([4,2])]
max(a)
Its working well
0 dla odpowiedzi nr 4
Aby mieć tablicę max wraz z idx, używam teraz:
a = [array([6,2]),array([8,3]),array([4,2])]
In: max_a = map(max, a)
Out: max_a = [6,8,4]
In: idx = max_a.index(max(max_a))
Out: idx = 1
In: result = a[idx]
Out: reusult = [8,3]