Преобразование 2d-массива в 3d-массив в python

Извините за задание этого вопроса, если он уже задан, но в моем случае у меня есть специальная матрица размером 3000000×50, которую я хочу разбить на 300 матриц размером 10000×50. Я пробовал это, но он не работает

>>>import numpy as np >>>data=np.random.randn(3000000,50) >>>D=np.matrix.conjugate(data) >>>ts=50 >>>ts=int(ts) #number of time series that we have from our data >>>lw=1e4 >>>lw=int(lw) #length of each window >>>l=len(data)/lw #l is number of windows >>>l=np.floor(l) >>>l=int(l) #Dc is used to seperate each time series in l windows >>>Dc=np.zeros((l,lw,ts)) >>>for i in range(l): Dc[i][0:lw-1][0:ts-1]=D[(lw)*(i):(lw*(i+1))-1][0:ts-1] 

Если ваш начальный массив правильно отсортирован и вы хотите разделить массив на 300 матричных «ящиков», вам может понадобиться следующее переопределение марксиса

 import numpy as np data = np.random.randn(3000000,50) newData = data.reshape(300,10000,50) # This is as [300,10000,50] array print newData[0,...] # Show the first matrix, 1 of 300 

Вы ищете np.vsplit ( np.vsplit массив на несколько np.vsplit по np.vsplit (по- np.vsplit ) ) –

 np.vsplit(data,300) 

Пример прогона –

 In [56]: data Out[56]: array([[ 0.46677419, 0.07402051, 0.87270029, 0.12481164], [ 0.40789713, 0.36018843, 0.41731607, 0.17348898], [ 0.4701256 , 0.10056201, 0.31289602, 0.18681709], [ 0.52407036, 0.89913995, 0.59097535, 0.38376443], [ 0.06734662, 0.24470334, 0.09523911, 0.35680219], [ 0.91178257, 0.58710922, 0.75099017, 0.24929987]]) In [57]: np.vsplit(data,3) Out[57]: [array([[ 0.46677419, 0.07402051, 0.87270029, 0.12481164], [ 0.40789713, 0.36018843, 0.41731607, 0.17348898]]), array([[ 0.4701256 , 0.10056201, 0.31289602, 0.18681709], [ 0.52407036, 0.89913995, 0.59097535, 0.38376443]]), array([[ 0.06734662, 0.24470334, 0.09523911, 0.35680219], [ 0.91178257, 0.58710922, 0.75099017, 0.24929987]])] 

В зависимости от того, как вы собираетесь использовать вывод, вы можете просто преобразовать 2D-входной массив в трехмерный массив длиной 300 по первой оси, который должен быть намного более эффективным с точки зрения производительности и памяти. В памяти он должен быть бесплатным, поскольку reshaping создает только представление массива numpy. Реализация будет –

 data.reshape(300,-1,data.shape[1]) 

Пример прогона –

 In [68]: data Out[68]: array([[ 0.46677419, 0.07402051, 0.87270029, 0.12481164], [ 0.40789713, 0.36018843, 0.41731607, 0.17348898], [ 0.4701256 , 0.10056201, 0.31289602, 0.18681709], [ 0.52407036, 0.89913995, 0.59097535, 0.38376443], [ 0.06734662, 0.24470334, 0.09523911, 0.35680219], [ 0.91178257, 0.58710922, 0.75099017, 0.24929987]]) In [69]: data.reshape(3,-1,data.shape[1]) Out[69]: array([[[ 0.46677419, 0.07402051, 0.87270029, 0.12481164], [ 0.40789713, 0.36018843, 0.41731607, 0.17348898]], [[ 0.4701256 , 0.10056201, 0.31289602, 0.18681709], [ 0.52407036, 0.89913995, 0.59097535, 0.38376443]], [[ 0.06734662, 0.24470334, 0.09523911, 0.35680219], [ 0.91178257, 0.58710922, 0.75099017, 0.24929987]]]) 

Вот некоторые тесты времени выполнения, чтобы проверить эффективность сравнения, фактически расщепляя и переформатируя –

 In [72]: data = np.random.rand(6000,40) In [73]: %timeit np.vsplit(data,300) 100 loops, best of 3: 7.05 ms per loop In [74]: %timeit data.reshape(300,-1,data.shape[1]) 1000000 loops, best of 3: 1.08 µs per loop