Ошибка типа: аргумент имеет неправильный тип (ожидаемый numpy.ndarray, получил numpy.bool_)

#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()