Как вы можете наиболее эффективно сложить N строк 3D-массива, чтобы сформировать массив 4D, но продвигать только одну строку за раз?

#python #arrays #numpy

#питон #массивы #тупица

Вопрос:

Я хотел бы сложить N строк 3D-массива один за другим, чтобы сформировать массив 4D. Я хотел бы начать с первых N строк, т. е. строк = 1, …, N, и всегда продвигаться на одну строку, т. Е. Следующие N строк будут строками = 2, …, N 1. Это означает, что первые N строк 3D-массива становятся первой строкой 4D-массива. Следующие N строк 3D-массива становятся второй строкой 4D-массива и так далее.

Я уже нашел способ решить свою проблему. Однако код неэффективен, и для вычисления большого 3D-массива со множеством строк требуется вечность. Вот что я сделал:

 import numpy as np  N = 3 X = (np.ones((5,3)).transpose()*np.array([1,2,3,4,5])).transpose() X = np.dstack((X, 2*X))  Z = np.empty((0, N, X.shape[1], X.shape[2]))  for i in range(N-1, X.shape[0]):  temp1 = X[i-N 1:i 1, :, :]  temp1 = np.expand_dims(temp1, axis=0)  Z = np.append(Z, temp1, axis=0)  

Я надеюсь, что в коде будет ясно, какова моя цель.

Заранее спасибо за вашу помощь.

Ответ №1:

Часть, которая замедляет ваши решения, вероятно, заключается в операции np.append, поскольку внутренняя память для массива должна быть (повторно)выделена для каждой итерации цикла. Для больших массивов это может быть довольно накладными расходами. Из вашего фрагмента кода я предполагаю Z , что длина указана до цикла, поэтому эта модификация, вероятно, может ускорить ваш код:

 import numpy as np  N = 3 X = (np.ones((5,3)).transpose()*np.array([1,2,3,4,5])).transpose() X = np.dstack((X, 2*X))  n_z = X.shape[0] - N   1 Z = np.empty((n_z, N, X.shape[1], X.shape[2]))  for idx, i in enumerate(range(N-1, X.shape[0])):  Z[idx] = X[i-N 1:i 1, :, :]