functions array python numpy

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

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.