我想做以下几件事:
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()看起来很难。
发布于 2014-05-30 07:06:58
在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)
发布于 2014-05-30 05:45:30
您可以rollaxis
两次:
>>> 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
to更容易理解:
>>> 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
发布于 2014-05-30 05:39:24
我会看看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内置的可以做到这一点,我认为这是你最好的选择。
https://stackoverflow.com/questions/23943379
复制相似问题