Ответ 1
Почему бы просто не использовать numpy.array_equal(a1, a2)
[docs] функции NumPy?
У меня есть одномерный массив размером c
, который должен быть заполнен содержимым
a + b
. Я сначала выполняю a + b
на устройстве с помощью PyOpenCL
.
Я хочу быстро определить правильность массива результатов c
в python с помощью numpy
slicing.
Это то, что у меня в настоящее время есть
def python_kernel(a, b, c):
temp = a + b
if temp[:] != c[:]:
print "Error"
else:
print "Success!"
Но я получаю ошибку:
ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()
Но кажется, что a.any
или a.all
будет просто определять, не являются ли значения 0.
Что делать, если я хочу проверить, все ли массивы в массиве numpy
temp
равны каждому значению в массиве numpy
c
?
Почему бы просто не использовать numpy.array_equal(a1, a2)
[docs] функции NumPy?
np.allclose является хорошим выбором, если тип данных np.array
- это float. np.array_equal
работает не всегда. Например:
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])
Результат:
>>> 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'
Вы бы назвали any
результатом сравнения: if np.any(a+b != c):
или эквивалентно if np.all(a+b == c):
. a+b != c
создает массив dtype=bool
, а затем any
смотрит на этот массив, чтобы увидеть, есть ли какой-либо элемент 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
Сказав все это, Amber solution, вероятно, быстрее, поскольку ему не нужно создавать весь массив логических результатов.