#python #arrays #numpy
#python #массивы #numpy
Вопрос:
Сейчас я работаю над Cython, где мне нужно определить тип и размер массива NumPy перед запуском кода. У меня есть эти координаты (x, y) в качестве входных данных:
list_a = [(2, 16), (24, 26)]
list_b = [(18, 8), (30, 22)]
Поскольку я использую NumPy, я преобразую список в массив NumPy:
arr_a = numpy.array([(2, 16), (24, 26)])
arr_b = numpy.array([(18, 8), (30, 22)])
Это код, скомпилированный в Cython, который я использую:
%%cython
import numpy
cimport numpy
cimport cython
ctypedef numpy.int_t DTYPE_t
def do_iter(numpy.ndarray[DTYPE_t,ndim=2] arr_a, numpy.ndarray[DTYPE_t,ndim=2] arr_b):
for a in arr_a:
for b in arr_a:
if a != b:
for i in arr_b:
for j in arr_b:
if i != j:
print(a,b,i,j)
Я ожидаю следующего вывода:
(2, 16) (24, 26) (18, 8) (30, 22)
(2, 16) (24, 26) (30, 22) (18, 8)
(24, 26) (2, 16) (18, 8) (30, 22)
(24, 26) (2, 16) (30, 22) (18, 8)
Сначала я получил следующую ошибку: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
затем я изменил код на:
do_iter(arr_a.any(),arr_b.any())
Но это привело к другой ошибке: TypeError: Argument 'arr_a' has incorrect type (expected numpy.ndarray, got numpy.bool_)
я подозреваю, что я определяю неправильный тип или измерение NumPy. Любая помощь приветствуется, спасибо!
Ответ №1:
Чтобы устранить первую полученную ошибку, вам нужно завершить сравнения, .any()
а не изменять входные данные.
...
if (a!=b).any():
...
if (i!=j).any():
...
Эта ошибка вызвана тем a!=b
, что даст вам что-то вроде (True, False)
, поскольку это сравнение 2 массивов 1×2. Если вы хотите, чтобы условие было истинным, если любой из 2 элементов отличается, используйте .any()
, как указано выше. Но если вы хотите, чтобы условие было истинным, если оба элемента должны быть разными, измените приведенное выше на .all()