矢量化 - 如何在没有循环的情况下追加数组

时间:2018-03-18 10:55:54

标签: python numpy vectorization

我有以下代码:

x = range(100)
M = len(x)
sample=np.zeros((M,41632))
for i in range(M):
    lista=np.load('sample'+str(i)+'.npy')
    for j in range(41632):
        sample[i,j]=np.array(lista[j])
     print i

创建一个由sample_i numpy数组组成的数组。

sample0,sample1,sample3等是numpy数组,我的预期输出是Mx41632数组,如下所示:

sample = [[sample0],[sample1],[sample2],...]

如何在没有循环的情况下压缩并更快速地执行此操作? M也可以达到100万。

或者,如果起点是1000而不是0,我怎样才能附加我的样本数组?

提前致谢

2 个答案:

答案 0 :(得分:0)

numpy非常简单。考虑这个例子:

import numpy as np
l = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
#create an array with 4 rows and 3 columns
arr = np.zeros([4,3])
arr[:,:] = l

您还可以单独插入行或列:

#insert the first row
arr[0,:] = l[0]

您必须提供相同的尺寸。

答案 1 :(得分:0)

初始加载

通过避免内循环而不是将sample初始化为零,您可以更快地使代码更快。

x = range(100)
M = len(x)
sample = np.empty((M, 41632))
for i in range(M):
    sample[i, :] = np.load('sample'+str(i)+'.npy')

在我的测试中,这使读取代码从3秒到60毫秒!

添加行

通常,更改numpy数组的大小非常慢。以这种方式加载数据后,您可以追加一行:

sample = np.insert(sample, len(sample), newrow, axis=0)

但这几乎不是你想做的事,因为它太慢了。

更好的存储空间:HDF5

如果M非常大,你可能会开始耗尽内存。

我建议您查看PyTables,这样您就可以将样本结果存储在一个HDF5文件中并操作数据而不将其加载到内存中。这通常比你现在使用的.npy文件快得多。