Ошибка значения: оси не соответствуют массиву — не удается транспонировать массив

#python #numpy #numpy-ndarray #transpose #cv2

Вопрос:

Ошибка Отслеживания

 Traceback (most recent call last):
File "C:Userstrial2trial.py", line 55, in <module>
image_stack(image)
File "C:Userstrial2trial.py", line 41, in image_stack
transposed_axes = np.transpose(img, axes=concat)
File "<__array_function__ internals>", line 5, in transpose
File "C:Userstrial2venvlibsite-packagesnumpycorefromnumeric.py", line 660, in transpose
return _wrapfunc(a, 'transpose', axes)
File "C:Userstrial2venvlibsite-packagesnumpycorefromnumeric.py", line 57, in _wrapfunc
return bound(*args, **kwds)
ValueError: axes don't match array
 

Ошибка обратной трассировки также присутствует, если это помогает решить проблему
Мне нужно рассчитать новые оси транспонирования для изображения, которое было введено в функцию в качестве параметра. Функция получает форму изображения, а затем вычисляет оси транспонирования для изображения. Проблема возникает при переносе массива изображений на новые оси. Я не могу понять, почему это не работает. Нужно ли мне превращать переменную concat в кортеж, чтобы она работала должным образом, или это что-то другое вызывает у нее проблему

 def image_stack(image):
    img_shape = cv2.imread(image).shape
    img = np.asarray(img_shape)
    print(type(img))
    n = len(img)
    val_1 = list(range(1, n - 1, 2))
    val_2 = list(range(0, n - 1, 2))
    print(img)
    if n % 2 == 0:
        y_ax = val_1
        x_ax = val_2
        axes = (y_ax, x_ax, [n-1])
    else:
        y_ax = val_2
        x_ax = val_1
        axes = (y_ax, x_ax, [n - 1])
    print(type(axes))
    concat = np.concatenate(axes)
    print(concat)
    if type(axes) == tuple:
        transposed_axes = np.transpose(img, axes=concat)
        print(transposed_axes)

image = 'C:\trial_images\9.jpg'
image_stack(image) 
 

Комментарии:

1. В чем img.shape и concat ценность. Для 2d-массива axes только be [0,1] (без изменений) или [1,0]` (по умолчанию) .. For 3d it has to be some permutation of [0,1,2]. If your конкат` — это не что-то подобное, я предлагаю перечитать transpose документы.

2. @hpaulj img.shape было [720, 1280, 3 ] и для concat значений, где [0,1, 2] по типу было numpy.ndarray . Должен ли я изменить его на кортеж, или значения неверны, как вы сказали [0,1,2], являются перестановкой для 3d

Ответ №1:

Тип аргумента axes не имеет значения:

 In [96]: arr = np.ones( [720, 1280, 3 ] )
In [97]: np.transpose(arr,[0,1,2]).shape
Out[97]: (720, 1280, 3)
In [98]: np.transpose(arr,(0,1,2)).shape
Out[98]: (720, 1280, 3)
In [99]: np.transpose(arr,np.array([0,1,2])).shape
Out[99]: (720, 1280, 3)
 

но если я предоставлю больше значений, чем размеры arr , я получу вашу ошибку:

 In [103]: np.transpose(arr,[0,1,2,3]).shape
Traceback (most recent call last):
  File "<ipython-input-103-fc01ec77b59e>", line 1, in <module>
    np.transpose(arr,[0,1,2,3]).shape
  File "<__array_function__ internals>", line 5, in transpose
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/fromnumeric.py", line 660, in transpose
    return _wrapfunc(a, 'transpose', axes)
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/fromnumeric.py", line 57, in _wrapfunc
    return bound(*args, **kwds)
ValueError: axes don't match array
 

Я ожидаю того же для [0,1,2] и 2d arr .

Надеюсь, это даст вам представление о том, как самостоятельно устранять проблемы. Запустите интерактивный сеанс и попробуйте некоторые альтернативы.