Python 矢量化-如何在没有循环的情况下为
我有以下代码:Python 矢量化-如何在没有循环的情况下为,python,numpy,vectorization,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 创建由示例数组组成的数组 sample0、sample1、sample3等是numpy阵列,我的
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
创建由示例数组组成的数组
sample0、sample1、sample3等是numpy阵列,我的预期输出是Mx41632阵列,如下所示:
sample = [[sample0],[sample1],[sample2],...]
如何在没有循环的情况下使此操作更紧凑、更快速?M也可以达到100万
或者,如果起点是1000而不是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]
您只需提供相同的尺寸。初始载荷
通过避免内部循环并且不将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非常大,您可能会开始耗尽内存
我建议您看一下,这将允许您将示例结果存储在一个HDF5文件中,并在不将其加载到内存的情况下操作数据。这通常比您现在使用的.npy文件快得多。请在您的问题中添加一个最小且可验证的示例。目前尚不清楚您正在处理的阵列类型以及预期的输出是什么。对于给您带来的不便,我们深表歉意。现在清楚了吗?@ USER2429,如果其中一个答案帮助了你,考虑接受或评论为什么它没有回答问题。谢谢。如何在没有循环的情况下快速加载数千个.npy阵列?问题是,循环需要数小时才能加载数千个阵列。我认为你无法回避这个问题。您可以使用优化的numpy方法附加到数组中,但我认为您无法加载文件。可能访问硬盘上的内存(加载文件)花费的时间最多,但您无法回避。但是,您可能希望在大阵列准备就绪时使用一些序列化(例如pickle)来保存它。然后你可以随时使用它。反序列化如此大的数组应该比加载数千个文件快得多。非常感谢!例如,一旦我存储了前5000个数据,是否有办法从5001重新启动代码,并将新值附加到存储的数组中?现在还不清楚重新启动代码是什么意思。您的意思是在上面的代码已经运行并且
sample
仍在内存中后,向sample
添加额外的列吗?是的,正是这样,我添加了一个关于添加行的注释。一般来说,这不是你想要做的。如果要存储这么多数据(数百万行),我真的建议您尝试pytables。