【问题标题】:Vectorization - how to append array without loop for矢量化 - 如何在没有循环的情况下附加数组
【发布时间】:2018-08-27 01:46:28
【问题描述】:

我有以下代码:

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,我如何附加我的示例数组?

提前致谢

【问题讨论】:

  • 请在您的问题中添加一个最小且可验证的示例。目前尚不清楚您正在处理什么样的数组以及预期的输出是什么。
  • 很抱歉给您带来不便。现在清楚了吗?
  • @user23299 如果其中一个答案对您有所帮助,请考虑接受或评论为什么它没有回答问题。

标签: python numpy vectorization


【解决方案1】:

初始加载

您可以通过避免内部循环和不将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 文件快很多。

【讨论】:

  • 非常感谢!例如,一旦我存储了前 5000 个数据,有没有办法从 5001 重新启动代码,将新值附加到存储的数组中?
  • 不清楚重启代码是什么意思。您的意思是在上面的代码已经运行并且sample 仍在内存中之后向sample 添加额外的列吗?
  • 是的,就是这样
  • 我添加了关于添加行的注释。一般来说,这不是你想要做的。如果您要存储这么多数据(数百万行),我真的建议您尝试 pytables。
【解决方案2】:

使用 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]

您只需要提供相同的尺寸即可。

【讨论】:

  • 谢谢。如何在没有循环的情况下快速加载数千个 .npy 数组?问题是 for 循环需要数小时才能加载数千个数组
  • 我认为您无法解决这个问题。您可以使用优化的 numpy 方法附加到数组,但我认为您无法对加载文件做任何事情。可能访问硬盘驱动器上的内存(加载文件)花费的时间最多,但你无法绕过它。
  • 但是,您可能希望在大数组准备好时使用一些序列化(例如 pickle)来保存大数组。然后,您可以随时使用它。这么大的数组的反序列化应该比加载数千个文件要快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多