从numpy数组的numpy数组中有效地创建一个块numpy数组

时间:2016-12-18 09:11:24

标签: python arrays performance numpy

首先是一个简单的例子

import numpy as np

a = np.ones((2,2))
b = 2*np.ones((2,2))
c = 3*np.ones((2,2))
d = 4*np.ones((2,2))
e = np.array([[a,b],[c,d]])
print(np.vstack(np.array([np.hstack(e[i,:]) for i in range(2)])))

产生

[[ 1.  1.  2.  2.]
 [ 1.  1.  2.  2.]
 [ 3.  3.  4.  4.]
 [ 3.  3.  4.  4.]]

print(np.bmat(e.tolist()))print(np.bmat([[a,b],[c,d]]))的结果完全相同(模数np.bmat使用np.asarray()创建可以投射的numpy矩阵的事实。

然而,我的问题是我有一个代码,我创建一个36的大型numpy数组(暂时,将变得更晚,如400)2D numpy数组,我想创建一个大块numpy数组他们我想有效地做到这一点,并且如果可能的话,避免列表和numpy数组之间的任何转换,因为这是更大的循环结构的一部分,因此将多次完成(每次数组都不同)。这可能吗?

1 个答案:

答案 0 :(得分:3)

np.swapaxes(e, 1, 2).reshape([4, 4])

如果你检查从e绘制元素的顺序以产生我们想要的输出,你会发现我们想要沿着轴3,然后是1,然后是2,然后是0. {{ 1}}沿轴3绘制元素,然后是2,然后是1,然后是0,所以我们在调用reshape之前交换轴1和2。