2011-08-18 22 views
15

Tengo una matriz numpy unidimensional c que se supone que debe llenarse con los contenidos de a + b. Estoy ejecutando primero a + b en un dispositivo usando PyOpenCL.Comprobando si todos los valores en una matriz numpy son iguales

Quiero determinar rápidamente la corrección de la matriz de resultados c en python usando numpy slicing.

Esto es lo que tengo actualmente

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

pero me sale el error:

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

Pero parece a.any o a.all se acaba de determinar si los valores no son 0.

¿Qué debo hacer si deseo probar si todos los escaladores de la matriz numpytemp son iguales a todos los valores en la matriz numpyc?

+2

'all_values_are_same = all (your_array [0] == your_array):' Lo que hace es devolver una lista de booleana si cada valor es igual al primer valor, y afirma que todos son verdaderos. –

Respuesta

49

¿Por qué no utilizar numpy.array_equal(a1, a2)[docs] desde las funciones de NumPy?

+3

Puede verificar el código fuente de array_equal(), y porque llama a equal(), también crea todo el vector booleano. – HYRY

7

Llamarías any en el resultado de la comparación: if np.any(a+b != c): o equivalentemente if np.all(a+b == c):. a+b != c crea una matriz de dtype=bool, y luego any examina esa matriz para ver si algún miembro es 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 

Habiendo dicho todo esto, sin embargo, Amber's solution es probablemente más rápido, ya que no tiene que crear toda la matriz resultado booleano.

10

np.allclose es una buena opción si np.array tipo de datos es flotadores. np.array_equal no siempre funciona correctamente. Por ejemplo:

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

Resultado:

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

Esto me estaba dando dolor de cabeza, es bueno saber que 'np.array_equal' bombas con flotadores. ¡Gracias! – Gabriel

+1

Errores de precisión de coma flotante habituales. No culparía a 'array_equal' por trabajar incorrectamente aquí. Hace lo que se supone que debe hacer. Cualquier sí, 'allclose' es la elección correcta para lo que pretendes hacer. – Michael

Cuestiones relacionadas