私は次のことをしたいと思います:
for i in dimension1:
for j in dimension2:
for k in dimension3:
for l in dimension4:
B[k,l,i,j] = A[i,j,k,l]
ループを使用しません。最終的に、AとBの両方に同じ情報が含まれますが、インデックスが異なります。
次元1、2、3、4は同じでも異なっていてもよいことを指摘しなければなりません。したがって、numpy.reshape()は難しいようです。
注意してください: Jaimeの答え の方が良いです。 NumPyはnp.transpose
まさにこの目的のため。
または np.einsum ;を使用しますこれはおそらくその意図された目的の倒錯ですが、構文は非常に素晴らしいです:
In [195]: A = np.random.random((2,4,3,5))
In [196]: B = np.einsum('klij->ijkl', A)
In [197]: A.shape
Out[197]: (2, 4, 3, 5)
In [198]: B.shape
Out[198]: (3, 5, 2, 4)
In [199]: import itertools as IT
In [200]: all(B[k,l,i,j] == A[i,j,k,l] for i,j,k,l in IT.product(*map(range, A.shape)))
Out[200]: True
Numpyでこれを行う標準的な方法は、 np.transpose
のオプションの置換引数。あなたの場合、ijkl
からklij
に移動するには、順列は(2, 3, 0, 1)
、例:
In [16]: a = np.empty((2, 3, 4, 5))
In [17]: b = np.transpose(a, (2, 3, 0, 1))
In [18]: b.shape
Out[18]: (4, 5, 2, 3)
rollaxis
を2回使用できます。
>>> A = np.random.random((2,4,3,5))
>>> B = np.rollaxis(np.rollaxis(A, 2), 3, 1)
>>> A.shape
(2, 4, 3, 5)
>>> B.shape
(3, 5, 2, 4)
>>> from itertools import product
>>> all(B[k,l,i,j] == A[i,j,k,l] for i,j,k,l in product(*map(range, A.shape)))
True
または、多分 swapaxes
のほうが簡単です:
>>> A = np.random.random((2,4,3,5))
>>> C = A.swapaxes(0, 2).swapaxes(1,3)
>>> C.shape
(3, 5, 2, 4)
>>> all(C[k,l,i,j] == A[i,j,k,l] for i,j,k,l in product(*map(range, A.shape)))
True
私はnumpy.ndarray.shapeとitertools.productを見ます:
import numpy, itertools
A = numpy.ones((10,10,10,10))
B = numpy.zeros((10,10,10,10))
for i, j, k, l in itertools.product(*map(xrange, A.shape)):
B[k,l,i,j] = A[i,j,k,l]
「ループを使用しない」とは、もちろん「ネストされたループを使用しない」という意味です。これを行うnumpyビルトインがなければ、これが最善の策だと思います。
numpy.moveaxis()
formoving必要な軸を目的の場所に移動します。 Jaimeの答え から例を盗んでいる例を示します。
In [160]: a = np.empty((2, 3, 4, 5))
# move the axes that are originally at positions [0, 1] to [2, 3]
In [161]: np.moveaxis(a, [0, 1], [2, 3]).shape
Out[161]: (4, 5, 2, 3)