2011-08-18 43 views
15

Tôi có mảng một chiều một chiều c được cho là phải chứa đầy nội dung của a + b. Lần đầu tiên tôi thực hiện a + b trên thiết bị sử dụng PyOpenCL.Kiểm tra xem tất cả các giá trị trong một mảng có khối không bằng nhau là

Tôi muốn nhanh chóng xác định độ chính xác của mảng kết quả c trong python sử dụng cắt numpy.

Đây là những gì tôi đang có

def python_kernel(a, b, c): 
    temp = a + b 
    if temp[:] != c[:]: 
     print "Error" 
    else: 
     print "Success!" 

Nhưng tôi nhận được lỗi:

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

Nhưng có vẻ như a.any hoặc a.all sẽ chỉ xác định xem các giá trị không phải là 0.

Tôi nên làm gì nếu tôi muốn thử nghiệm nếu tất cả các scaler trong mảng numpytemp bằng với mọi giá trị trong mảng numpyc?

+2

'all_values_are_same = tất cả (your_array [0] == your_array): 'gì điều đó không được trả lại một danh sách các boolean nếu mỗi giá trị tương đương với giá trị đầu tiên, và khẳng định tất cả đều đúng. –

Trả lời

49

Tại sao không chỉ sử dụng numpy.array_equal(a1, a2)[docs] từ các chức năng của NumPy?

+3

Bạn có thể kiểm tra mã nguồn của array_equal(), và bởi vì nó gọi bằng(), nó cũng tạo ra toàn bộ vector boolean. – HYRY

7

Bạn sẽ gọi số any trên kết quả so sánh: if np.any(a+b != c): hoặc tương đương if np.all(a+b == c):. a+b != c tạo một mảng dtype=bool và sau đó any xem mảng đó để xem có thành viên nào là True hay không.

>>> import numpy as np 
>>> a = np.array([1,2,3]) 
>>> b = np.array([4,5,2]) 
>>> c = a+b 
>>> c 
array([5, 7, 5]) # <---- numeric, so any/all not useful 
>>> a+b == c 
array([ True, True, True], dtype=bool) # <---- BOOLEAN result, not numeric 
>>> all(a+b == c) 
True 

Có nói tất cả những gì, tuy nhiên, Amber's solution có lẽ nhanh hơn vì nó không phải tạo toàn bộ mảng kết quả boolean.

10

np.allclose là lựa chọn tốt nếu np.array loại dữ liệu đang nổi. np.array_equal không phải lúc nào cũng hoạt động bình thường. Ví dụ:

import numpy as np 
def get_weights_array(n_recs): 
    step = - 0.5/n_recs 
    stop = 0.5 
    return np.arange(1, stop, step) 

a = get_weights_array(5) 
b = np.array([1.0, 0.9, 0.8, 0.7, 0.6]) 

Kết quả:

>>> a 
array([ 1. , 0.9, 0.8, 0.7, 0.6]) 
>>> b 
array([ 1. , 0.9, 0.8, 0.7, 0.6]) 
>>> np.array_equal(a, b) 
False 
>>> np.allclose(a, b) 
True 

>>> import sys 
>>> sys.version 
'2.7.3 (default, Apr 10 2013, 05:13:16) \n[GCC 4.7.2]' 
>>> np.version.version 
'1.6.2' 
+0

Điều này khiến tôi đau đầu, biết rằng bom 'np.array_equal' có phao nổi. Cảm ơn bạn! – Gabriel

+1

Lỗi chính xác điểm nổi thông thường. Tôi sẽ không đổ lỗi cho 'array_equal' để làm việc không chính xác ở đây. Nó làm những gì nó được cho là phải làm. Bất kỳ có, 'allclose' là sự lựa chọn chính xác cho những gì bạn định làm. – Michael

Các vấn đề liên quan