我正在用numpy(python2.7)从1d数组构建2d数组。我在寻找最有效的方法。最新的发现是:
a=np.ones(100000)
# SUBSCRIPTING
n_dim=3
x=0
for i in xrange(0,1000):
x=np.zeros(shape=(100000,n_dim))
for j in xrange(0,n_dim):
x[:,j]=a*j
# ~1.574 s/1000 loops - joinind 3 1d arrays
# ~9.162 s/1000 loops - joinind 10 1d arrays
# STACKING
for i in xrange(0,1000):
x=a*0.
for j in xrange(1,n_dim):
x=np.vstack((x,a*j))
x=x.T
# ~1.786 s/1000 loops - joinind 3 1d arrays
# ~16.603 s/1000 loops - joinind 10 1d arrays
第一种方法(下标)是我想出的最快的方法,与第二种方法(叠加)相比,性能的提高随着我加入的一维数组的数量而增加。由于我需要重复这一步,我想知道是否有更快的方法?如果解决方案提供了显著的性能提升,那么我愿意使用这种方案。在
也许我可以尝试以一种限制堆叠操作次数的方式堆叠阵列(例如,将4个1d阵列连接起来:首先堆叠阵列1和2,然后堆叠阵列3和4,最后再堆叠结果阵列)。在
我的问题是如何从一维阵列高效地构建二维阵列。我在这里使用的数组中的值是虚拟的。在实际应用程序中,我加入的一维数组中的大多数值可能会有所不同。在
因为numpy将数组(默认情况下)存储在row-major order中,按行设置值更有效。因此,我将使用:
或者,您可以将
^{pr2}$x
定义为列major,然后,这与前面的代码一样快:您还可以使用numpy外部产品创建
x
:这是使用
vstack
的糟糕方法;您反复调用它,为每个j
创建一个新的x
正确的方法是构建一个数组列表,并且只使用
^{pr2}$vstack
一次。在在这种情况下,
append
与vstack
一样工作,可能更快。还有一个column_stack
函数。关键的区别是我利用了快速列表追加,以及array
(和vstack
)在其参数列表中获取许多项的能力。在如果你能把循环写成一个列表理解,那就更好了
在预先分配的数组中插入通常是最快的选择。但是您应该熟悉这种从列表构建的方法。在
基本
np.array
表达式就是这样,从1d数组的列表(或者在本例中是列表)构建2d。在
jakub
注意到{n_dim=10
:显然,
np.array
正在将输入数组转换为列表,然后从嵌套列表(或类似的东西)中执行其通常的构造。在数组列表上的
vstack
要快得多。比迭代的vstack
(我预期的)快。基本上与Ramon's
行插入(和插入order='F'
)相同当
concatenate
(由vstack
使用)被编译时,我怀疑它做了类似于迭代插入的操作。在源代码中,通常创建一个空的目标数组,然后用适当的值填充它。在相关问题 更多 >
编程相关推荐