2012-09-28 35 views
11

Tôi đang cố gắng đặt tất cả các phần tử của rbs vào một mảng mới nếu các phần tử trong var (mảng khác) là> = 0 và < = .1. Tuy nhiên khi tôi thử đoạn mã sau tôi nhận được lỗi này:Giá trị thực của một mảng có nhiều hơn một phần tử không rõ ràng khi cố gắng lập chỉ mục một mảng

ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()` 

rbs = [ish[4] for ish in realbooks] 
for book in realbooks: 
    var -= float(str(book[0]).replace(":", "")) 
    bidsred = rbs[(var <= .1) and (var >=0)] 

bất kỳ ý tưởng về những gì tôi đang làm sai?

+0

Dòng nào gây ra lỗi? Ngoài ra, vui lòng định dạng mã của bạn để mã thực sự chạy. –

+0

Nó sẽ giúp nếu bạn in ra giá trị của var. Tại một đoán, vấn đề là trong chuỗi/float/văn bản thay thế biến bạn đang giảm dần ... Dữ liệu gốc trông như thế nào sẽ yêu cầu hàng loạt các hoạt động? – abought

Trả lời

27

Như tôi đã nói với bạn trong một chú thích vào một trang trước câu trả lời, bạn cần phải sử dụng một trong hai:

c[a & b] 

hoặc

c[np.logical_and(a, b)] 

Lý do là từ khóa and được sử dụng bởi Python để kiểm tra giữa hai boolean. Làm thế nào một mảng có thể là một boolean? Nếu 75% mặt hàng của nó là True, có phải là True hoặc False? Do đó, từ chối không để so sánh hai. Vì vậy, bạn phải sử dụng hàm lô-gic để so sánh hai mảng boolean trên cơ sở từng phần tử (np.logical_and) hoặc toán tử nhị phân &.

Hơn nữa, vì mục đích lập chỉ mục, bạn thực sự cần một mảng boolean có cùng kích thước với mảng mà bạn đang lập chỉ mục. Và nó phải là một mảng, bạn không thể sử dụng danh sách True/False thay thế: Lý do là sử dụng mảng boolean cho NumPy biết phần tử nào cần trả về. Nếu bạn sử dụng danh sách True/False, NumPy sẽ hiểu rằng danh sách 1/0 là số nguyên, tức là, chỉ mục, có nghĩa là bạn sẽ nhận được phần tử thứ hai hoặc thứ nhất của mảng. Không phải những gì bạn muốn.

Bây giờ, khi bạn có thể đoán, nếu bạn muốn sử dụng hai mảng boolean a hoặc b cho chỉ mục, chọn các mục mà một trong hai a hoặc b là True, bạn muốn sử dụng

c[np.logical_or(a,b)] 

hoặc

c[a | b] 
8

Bạn thường nhận được thông báo lỗi này khi cố gắng sử dụng Python các toán tử logic (not, and, or) trên biểu thức so sánh liên quan đến mảng NumPy, ví dụ

>>> x = np.arange(-5, 5) 
>>> (x > -2) and (x < 2) 
Traceback (most recent call last): 
    File "<ipython-input-6-475a0a26e11c>", line 1, in <module> 
    (x > -2) and (x < 2) 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Đó là bởi vì so sánh như vậy, như trái ngược với sự so sánh khác bằng Python, tạo mảng các phép toán luận chứ không phải là phép toán đơn (nhưng có lẽ bạn đã biết rằng):

>>> x > -2 
array([False, False, False, False, True, True, True, True, True, True], dtype=bool) 
>>> x < 2 
array([ True, True, True, True, True, True, True, False, False, False], dtype=bool) 

Một phần của giải pháp cho bạn vấn đề có thể thay thế and bởi np.logical_and, phát sóng hoạt động AND qua hai mảng np.bool.

>>> np.logical_and(x > -2, x < 2) 
array([False, False, False, False, True, True, True, False, False, False], dtype=bool) 
>>> x[np.logical_and(x > -2, x < 2)] 
array([-1, 0, 1]) 

Tuy nhiên, mảng như các phép toán luận không thể được sử dụng để chỉ mục vào danh sách Python bình thường, vì vậy bạn cần phải chuyển đổi đó để một mảng:

rbs = np.array([ish[4] for ish in realbooks]) 
Các vấn đề liên quan