python - array - Comprobando si todos los valores en una matriz numpy son iguales
python numpy arrays (3)
¿Por qué no usar numpy.array_equal(a1, a2) [docs] de las funciones de NumPy?
Esta pregunta ya tiene una respuesta aquí:
- Comparando dos matrices numpy para la igualdad, 4 respuestas por elementos
Tengo una matriz cidimensional unidimensional que se debe llenar con el contenido de a + b . Primero estoy ejecutando a + b en un dispositivo usando PyOpenCL .
Quiero determinar rápidamente la corrección de la matriz de resultados c en python usando una numpy .
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: el valor de verdad de una matriz con más de un elemento es ambiguo. Utilice a.any () o a.all ()
Pero parece que a.any o a.all determinará si los valores no son 0.
¿Qué debo hacer si quiero probar si todos los escaladores en la numpy matriz numpy son iguales a todos los valores de la matriz c numpy ?
np.allclose es una buena opción si el tipo de datos np.array es flotante. 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''
if np.any(a+b != c): any en el resultado de la comparación: if np.any(a+b != c): o de manera equivalente if np.all(a+b == c): a+b != c crea una matriz de dtype=bool , y luego any mira 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
Sin embargo, una vez dicho todo esto, la solución de Amber es probablemente más rápida, ya que no tiene que crear toda la matriz de resultados booleanos.