#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, :, :]