Blockwise изменить в NumPy? - PullRequest
       3

Blockwise изменить в NumPy?

1 голос
/ 05 апреля 2019

У меня есть массив с столбцами, которые находятся в блоках.Я хочу переставить блоки.Это концептуально просто, и я думаю, что это можно сделать просто, но я не знаю, как.

Учитывая массив элементов в форме блока np.hstack(list_of_blocks), я хочу получить np.vstack(list_of_blocks).

Чтобы сделать его более точным, я хочу перейти от массива a к массиву b в приведенном ниже фрагменте.

import numpy as np
a = np.zeros((3,6))
b = np.zeros((9,2))
t_max = 3
for col in range(1,7):
    for time in range(1,t_max+1):    
        val = ((1+col)//2)*100+((col+1) % 2)*10+time
        a[time-1,col-1]= val
        b[time+t_max*(((1+col)//2)-1)-1,((col+1) % 2)] = val

и матрицы выглядят следующим образом:

>>> print(a)
[[101. 111. 201. 211. 301. 311.]
 [102. 112. 202. 212. 302. 312.]
 [103. 113. 203. 213. 303. 313.]]

>>> print(b)
[[101. 111.]
 [102. 112.]
 [103. 113.]
 [201. 211.]
 [202. 212.]
 [203. 213.]
 [301. 311.]
 [302. 312.]
 [303. 313.]]

OfКонечно, матрицы не 3 x (2*3), а n x (k*m)

Какой эффективный способ изменить эту форму в numpy?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Изменение формы, перестановка осей и изменение формы -

N = a.shape[1]//t_max
b_out = a.reshape(a.shape[0],-1,N).swapaxes(0,1).reshape(-1,N)

Подробнее о intuition behind nd-to-nd array transformation.

1 голос
/ 05 апреля 2019

np.vstack(np.hsplit(a,3)) делает именно то, о чем просили, читается, но менее производительно, чем ответ Дивкара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...