2011-08-18 11 views
15

Ho una matrice monodimensionale numerica c che deve essere riempita con il contenuto di a + b. Per prima cosa eseguo a + b su un dispositivo utilizzando PyOpenCL.Test se tutti i valori in una matrice numpy sono uguali

Voglio determinare rapidamente la correttezza dell'array di risultati c in python utilizzando slicing numpy.

Questo è quello che ho attualmente

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

ma ho l'errore:

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

Ma sembra a.any o a.all sarà solo determinare se i valori non sono 0.

Cosa devo fare se voglio testare se tutti gli scaler nell'array numpytemp sono uguali a tutti i valori in l'array numpyc?

+2

'all_values_are_same = tutti (your_array [0] == your_array):' Ciò che fa è restituire un elenco di booleana se ogni valore è uguale al primo valore, e afferma che tutti sono vere. –

risposta

49

Perché non usare semplicemente numpy.array_equal(a1, a2)[docs] dalle funzioni di NumPy?

+3

È possibile controllare il codice sorgente di array_equal() e poiché chiama uguale(), crea anche l'intero vettore booleano. – HYRY

7

È possibile chiamare any sul risultato del confronto: if np.any(a+b != c): o equivalente if np.all(a+b == c):. a+b != c crea un array di dtype=bool e quindi any esamina quell'array per vedere se un membro è True.

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

Detto tutto questo, però, Amber's solution è probabilmente più veloce dal momento che non ha bisogno di creare l'intero array risultato booleano.

10

np.allclose è una buona scelta se il tipo di dati np.array è mobile. np.array_equal non funziona sempre correttamente. Per esempio:

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

Risultato:

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

Questo mi stava facendo venire il mal di testa, bello sapere che bombe 'np.array_equal' con galleggianti. Grazie! – Gabriel

+1

Errori di precisione in virgola mobile usuali. Non darei la colpa a 'array_equal' perché non funzioni correttamente qui. Fa quello che dovrebbe fare. Qualsiasi sì, 'allclose' è la scelta giusta per ciò che si intende fare. – Michael

Problemi correlati