首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定numpy数组整形策略

如何确定numpy数组整形策略
EN

Stack Overflow用户
提问于 2015-05-29 01:34:34
回答 1查看 1.2K关注 0票数 7

对于python项目,我经常发现自己在重塑和重新排列n维numpy数组。然而,我很难确定如何处理这个问题,可视化重塑方法的结果,并知道我的解决方案是有效的。

当遇到这样的问题时,我的策略是启动ipython,加载一些样本数据,反复尝试,直到我找到transpose(),reshape()s和swapaxes()s的组合,这就得到了想要的结果。它完成了工作,但没有真正理解正在发生的事情,并且经常产生难以维护的代码。

所以,我的问题是关于找到一个策略。您如何处理这样的问题?当你必须以所需的格式塑造ndarray时,你如何在你的脑海中将其可视化?你是如何采取正确的行动的?

为了让回答更具体一些,我们来看一个例子:

假设您想要重塑下面的3D数组

代码语言:javascript
运行
复制
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

到2D数组,其中来自第3维的第一列首先放置,第二列第二,....etc

结果应该如下所示:

代码语言:javascript
运行
复制
array([[ 0,  9, 18,  3, 12, 21,  6, 15, 24],
       [ 1, 10, 19,  4, 13, 22,  7, 16, 25],
       [ 2, 11, 20,  5, 14, 23,  8, 17, 26]])

PS。另外,任何关于这个主题的阅读材料都会很棒!

EN

回答 1

Stack Overflow用户

发布于 2015-05-29 02:45:06

我经常在ipython中玩弄形状。但是,为了更清楚起见,我从具有不同维数的数组开始。

代码语言:javascript
运行
复制
arr = np.arange(3*4*5).reshape(3,4,5)

这样,就可以更容易地确定轴是如何移动的,例如:

代码语言:javascript
运行
复制
In [25]: arr.shape
Out[25]: (3, 4, 5)

In [26]: arr.T.shape
Out[26]: (5, 4, 3)

In [31]: arr.T.reshape(5,-1)
Out[31]: 
array([[ 0, 20, 40,  5, 25, 45, 10, 30, 50, 15, 35, 55],
       [ 1, 21, 41,  6, 26, 46, 11, 31, 51, 16, 36, 56],
       [ 2, 22, 42,  7, 27, 47, 12, 32, 52, 17, 37, 57],
       [ 3, 23, 43,  8, 28, 48, 13, 33, 53, 18, 38, 58],
       [ 4, 24, 44,  9, 29, 49, 14, 34, 54, 19, 39, 59]])

其中作为不同的转置(这不会切换3,4的顺序)

代码语言:javascript
运行
复制
In [38]: np.transpose(arr,[2,0,1]).shape
Out[38]: (5, 3, 4)

In [39]: np.transpose(arr,[2,0,1]).reshape(5,-1)
Out[39]: 
array([[ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55],
       [ 1,  6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56],
       [ 2,  7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57],
       [ 3,  8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58],
       [ 4,  9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59]])

在开发函数时,我也喜欢使用像这样的“奇怪”形状的数组。这样,如果我真的搞砸了一些转置或广播,尺寸错误就会跳出来。经验告诉我,一旦我得到正确的尺寸,值也将是正确的。或者至少影响值的错误类别与影响尺寸的错误类别有很大不同。

我还随意地在开发代码中使用print arr.shape like语句,甚至assert x.shape==y.shape断言。

它还有助于标注尺寸:

代码语言:javascript
运行
复制
M, N, L = 3, 4, 5
np.empty((M,N,L))

或者像在einsum中一样

代码语言:javascript
运行
复制
np.einsum('ijk,kj->i', A, B) # if A is (M,N,L), B must be (L,N)

https://stackoverflow.com/a/29903842/901925是试图理解和解释rollaxis的一个例子。

另一种策略是查看numpy函数的Python代码。它们通常接受axis参数。看看他们是如何使用这些的是很有启发性的。有时特定的axis被旋转到前面,或者旋转到最后。有时一个数组被重塑成一个二维数组,除了一个轴之外的所有轴都被压缩为一。另一些则通过构造和操作索引元组来实现通用性。更高级的功能可以处理步幅和形状。

维度应该是第一个还是最后一个通常是一个优化问题-可能涉及到易用性(广播、索引)和速度之间的权衡。请记住,对于"C“顺序,最后一个维度形成了连续的块。

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

https://stackoverflow.com/questions/30513432

复制
相关文章

相似问题

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