2016-12-18 3 views
1

Первый простой примерСоздание массива блока Numpy из Numpy массива 2D Numpy массивов эффективно

import numpy as np 

a = np.ones((2,2)) 
b = 2*np.ones((2,2)) 
c = 3*np.ones((2,2)) 
d = 4*np.ones((2,2)) 
e = np.array([[a,b],[c,d]]) 
print(np.vstack(np.array([np.hstack(e[i,:]) for i in range(2)]))) 

который производит

[[ 1. 1. 2. 2.] 
[ 1. 1. 2. 2.] 
[ 3. 3. 4. 4.] 
[ 3. 3. 4. 4.]] 

которая точно так же, как и в результате print(np.bmat(e.tolist())) или print(np.bmat([[a,b],[c,d]])) (по модулю тот факт, что np.bmat создает матрицу numpy, которую можно отличить, используя np.asarray()).

Тем не менее, моя проблема в том, что у меня есть код, в котором я создаю массив с большой численностью 36 (на данный момент станет намного более поздним, например 400) 2D-массивами numpy, и я хочу создать один массив массивных блоков из них. Я хочу сделать это эффективно и, если возможно, избегать любых преобразований между списками и массивами numpy, так как это часть более крупной конструкции цикла, поэтому будет выполняться много раз (каждый раз разные массивы). Это возможно?

+0

ОК, может быть, я не понимаю. Действительно, для простого примера это работает. Но в моей реальной проблеме я создаю большой массив numpy массивов 2D numpy, и я не хочу преобразовывать его в список. – ThunderBiggi

+0

Если у вас есть 36 массивов, возможно, имеет смысл инициализировать массив o/p, а затем итеративно отрезать в массив o/p и выполнять задания? – Divakar

+0

Я не совсем понимаю, что вы имеете в виду. Количество массивов - это функция параметра, который я планирую увеличить в ближайшем будущем, поэтому он должен быть полностью автоматическим. – ThunderBiggi

ответ

3
np.swapaxes(e, 1, 2).reshape([4, 4]) 

Если изучить порядок, в котором элементы должны быть отрисованы из e для получения желаемого выхода, вы увидите, что мы хотим идти вдоль оси 3, затем 1, затем 2, затем 0. reshape рисует элементы вдоль оси 3, затем 2, затем 1, затем 0, поэтому мы обмениваем оси 1 и 2 перед вызовом reshape.

+0

Это именно то, что мне нужно. Я просто собирался отредактировать свой вопрос и сказать, что я попытался изменить форму и, похоже, не работает. – ThunderBiggi

Смежные вопросы