首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >交换numpy数组的维数

交换numpy数组的维数
EN

Stack Overflow用户
提问于 2014-05-30 05:33:06
回答 3查看 53.3K关注 0票数 46

我想做以下几件事:

代码语言:javascript
复制
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()看起来很难。

EN

回答 3

Stack Overflow用户

发布于 2014-05-30 07:06:58

在numpy中执行此操作的规范方法是使用np.transpose的可选排列参数。在您的示例中,要从ijkl转到klij,排列是(2, 3, 0, 1),例如:

代码语言:javascript
复制
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)
票数 102
EN

Stack Overflow用户

发布于 2014-05-30 05:45:30

您可以rollaxis两次:

代码语言:javascript
复制
>>> 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更容易理解:

代码语言:javascript
复制
>>> 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
票数 13
EN

Stack Overflow用户

发布于 2014-05-30 05:39:24

我会看看numpy.ndarray.shape和itertools.product:

代码语言:javascript
复制
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内置的可以做到这一点,我认为这是你最好的选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23943379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档