Я хотел бы перебрать матрицу матриц (действительно, звучит странно),
import numpy as np
ar = np.array
A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]], [[1,2,3],[4,5,6],[7,8,9]], [[20,21,22],[23,24,25],[26,27,28]]])
B = np.copy(A)
C = np.copy(A)
im = np.array([A,B,C])
для получения матрицы, в которой хранятся значения (x, y) позиции в последующих матрицах. Например, в [1, 2, 3] для позиции 1 это означает: A [0,0,0], в следующих матрицах появятся только единицы. Таким образом я получу массив в новой матрице (учитывая также A [0,0,1] и A [0,0,2]):
[[1 1 1] [2 2 2] [3 3 3]]
Поэтому для первого массива A:
[[[1 1 1] [2 2 2] [3 3 3]]
[[4 4 4] [5 5 5] [6 6 6]]
[[7 7 7] [8 8 8] [9 9 9]]]
Я создал эту функцию:
def loop_ar(arr):
matrix, v, c, s = arr.shape
new = np.zeros((v,c,s,matrix)) #The columns in the last array of new represent the subsequent arrays
for x in range(v):
for y in range(c):
for s in range(s):
for ma in range(matrix):
new[x,y,s,ma] = arr[ma, x, y, s]
return new
Однако выходные данные указывают, что матрица прекращает итерацию после нескольких оборотов:
[[[[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]]
[[4. 4. 4.]
[5. 5. 5.]
[0. 0. 0.]]
[[7. 7. 7.]
[0. 0. 0.]
[0. 0. 0.]]]
[[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]]
...
Когда я тестировал эту функцию в списке списков, она работала. Что случилось в этом случае? Как я могу это исправить? Это всего лишь простой случай, чтобы проиллюстрировать мои ожидания; Тем не менее, я хотел бы знать решение более сложной проблемы, когда B и C не являются копиями A. Как я могу заставить цикл затем повторяться?
B и C в более сложном случае должны иметь ту же форму, что и A, однако они будут отличаться в последнем массиве. Как и в А мы имеем:
[1 2 3]
в B мы бы, например, находились в той же позиции:
[23 34 56]
и в C:
[54 43 32]
Поэтому новая матрица будет включать массив:
[[1 23 54] [2 34 43] [3 56 32]]
Я выполнил эту задачу (надеюсь на это), преобразовав список в массив, потому что loop_arr работал для списков. Тем не менее, это окольный путь. Я хочу решение и объяснение прерывания в цикле.
Здесь я привожу случайные данные для более сложного вопроса:
A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]],[[20,21,22],[23,24,25],[26,27,28]]])
B = ar([[[23,34,56], [56, 78, 90], [12, 34, 32]], [[74,75,65], [25,57,76], [90,24,35]]])
C = ar([[[13,31,53], [54,96,69], [78, 90, 99]], [[35,64,66], [13,35,53], [37,73,61]], [[62, 87,97], [80,35,62], [75,76,67]]]
Новая матрица будет выглядеть так:
[[[[1 23 13] [2 34 31] [3 56 53]]
[[4 56 54] [5 78 96] [6 90 69]]
[[7 12 78] [8 34 90] [9 32 99]]]
...so on, so on, so on...
]]]]