对于python项目,我经常发现自己在重塑和重新排列n维numpy数组。然而,我很难确定如何处理这个问题,可视化重塑方法的结果,并知道我的解决方案是有效的。
当遇到这样的问题时,我的策略是启动ipython,加载一些样本数据,反复尝试,直到我找到transpose(),reshape()s和swapaxes()s的组合,这就得到了想要的结果。它完成了工作,但没有真正理解正在发生的事情,并且经常产生难以维护的代码。
所以,我的问题是关于找到一个策略。您如何处理这样的问题?当你必须以所需的格式塑造ndarray时,你如何在你的脑海中将其可视化?你是如何采取正确的行动的?
为了让回答更具体一些,我们来看一个例子:
假设您想要重塑下面的3D数组
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
结果应该如下所示:
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。另外,任何关于这个主题的阅读材料都会很棒!
发布于 2015-05-29 02:45:06
我经常在ipython中玩弄形状。但是,为了更清楚起见,我从具有不同维数的数组开始。
arr = np.arange(3*4*5).reshape(3,4,5)这样,就可以更容易地确定轴是如何移动的,例如:
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的顺序)
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断言。
它还有助于标注尺寸:
M, N, L = 3, 4, 5
np.empty((M,N,L))或者像在einsum中一样
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“顺序,最后一个维度形成了连续的块。
https://stackoverflow.com/questions/30513432
复制相似问题