【发布时间】:2016-12-18 09:11:23
【问题描述】:
先举个简单的例子
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 数组之间的任何转换,因为这是更大循环结构的一部分,因此将执行多次(每次数组都不同)。这可能吗?
【问题讨论】:
-
好的,也许我不清楚。事实上,对于这个简单的例子来说,这是可行的。但在我真正的问题中,我创建了一个大的 numpy 数组,其中包含 2D numpy 数组,我不想将它转换为列表
-
如果你有 36 个数组,也许初始化 o/p 数组然后迭代地切入 o/p 数组并进行分配是有意义的?
-
我不太明白你的意思。数组的数量是我计划在不久的将来增加的参数的函数,所以它应该是完全自动的
-
我的意思是你可以初始化一个 o/p 数组,
outof shape(4,4) 然后切片并赋值:out[:2,:2] = a等等。所有数组的形状都一样吗? -
所有数组的大小都相同,我知道(我设置的参数的函数)并且它们都是正方形的。一旦我开始使用 400 个或更多的数组,这样的分配效率会很低,不是吗?
标签: python arrays performance numpy