2016-12-19 2 views
1

У меня есть матричный матричный матрикс, который равен 888 * 100 * 100. Это представляет 888 выборок 100 на 100 сеток.Вращение и переворачивание многомерных матриц numpy

Я хочу применить преобразование к каждой сетке в матрице.

Я попытался mod_mat = np.rot90 (мат), но она изменила размер 100 * 888 * 100

Есть ли способ, чтобы осуществить преобразования в один присест? Или мне нужно перебирать каждую сетку и преобразовывать ее отдельно? Благодарю.

ответ

1

np.rot90 вращает первые два измерения, поэтому вы можете менять оси 0 и 2, вращать и менять назад, чтобы достичь того, чего вы хотите. Итерация на Python, вероятно, будет медленнее, потому что numpy - это высоко оптимизированная низкоуровневая библиотека кода, поэтому обычно лучше использовать встроенные модули.

In[9]: import numpy as np 
In[10]: x = np.arange(3*2*2).reshape(3, 2, 2) 
In[11]: x 
Out[11]: 
array([[[ 0, 1], 
     [ 2, 3]], 

     [[ 4, 5], 
     [ 6, 7]], 

     [[ 8, 9], 
     [10, 11]]]) 
In[12]: np.rot90(x.swapaxes(0, 2)).swapaxes(0, 2) 
Out[12]: 
array([[[ 2, 0], 
     [ 3, 1]], 

     [[ 6, 4], 
     [ 7, 5]], 

     [[10, 8], 
     [11, 9]]]) 
0

Вот подход, использующий transpose и flipping/reversing последняя ось -

mat.transpose(0,2,1)[...,::-1] 

Продолжительность испытания -

In [10]: a = np.random.rand(888 , 200 , 200) # Input array 

In [11]: %timeit np.rot90(a.swapaxes(0, 2)).swapaxes(0, 2) # @Wolfram's soln 
100000 loops, best of 3: 3.87 µs per loop 

In [12]: %timeit a.transpose(0,2,1)[...,::-1] 
1000000 loops, best of 3: 940 ns per loop 
Смежные вопросы