加快数组处理的想法

Idea to speed up array processing

我想通过处理数据集 A 创建数据集 B。因此,A (~ 2 Mio.) 中的每一列都必须以批处理方式处理(通过神经网络),导致 3 个输出堆叠在一起,然后例如存储在一个 numpy 数组中。

我的代码如下所示,这似乎不是最佳解决方案。

# Load data
data = get_data()

# Storage for B
B = np.empty(shape=data.shape)

# Process data
for idx, data_B in enumerate(data):
    # Process data
    a, b, c = model(data_B)

    # Reshape and feed in B
    B[idx * batch_size:batch_size * (idx + 1)] = np.squeeze(np.concatenate((a, b, c), axis=1))

我正在寻找加快堆叠或分配过程的想法。我不知道是否可以并行处理,因为最终所有内容都应该存储在同一个数组中(顺序并不重要)。有没有我可以使用的 python 框架?

加载数据需要 29 秒(只完成一次),堆叠和分配需要 20 秒,批量大小仅为 2。模型 命令需要 < 1 秒,分配数组需要5s 和所有其他部分 <1s.

您的阵列形状,尤其是维数,不清楚。我可以根据代码中的工作原理做出一些猜测。您的时间表明事情非常大,因此内存管理可能是一个大问题。创建大型临时数组需要时间。

什么是data.shape?至少可能是 2d; B 形状相同

B = np.empty(shape=data.shape)

现在迭代 data 的第一个维度;让我们称它们为行,尽管它们可能是 2d 或更大:

# Process data
for idx, data_B in enumerate(data):
    # Process data
    a, b, c = model(data_B)

a 的性质是什么,等等。我假设数组的形状类似于 data_B。但这只是猜测。

    # Reshape and feed in B
    B[idx * batch_size:batch_size * (idx + 1)] =
         np.squeeze(np.concatenate((a, b, c), axis=1)

要使 concatenate 有效,a,b,c 必须是 2d(至少)。让我们猜测它们都是 (n,m)。结果是 (n,3m)。为什么要挤?形状是 (1,3m)?

我不知道 batch_size。但是除了 1 以外的任何东西,我认为这行不通。 B[idx:idx+1, :] = ... 有效,因为 idx 的范围是 B.shape[0],但使用其他值会产生错误。

使用这个 batchsize 切片索引,它几乎看起来像是在尝试将迭代值串在一个长的一维数组中,每次迭代 batchsize 个值。但这不符合 B 匹配 data 的形状。

撇开这个难题不谈,我想知道您是否真的需要串联。你可以初始 B 这样你就可以直接赋值,例如

B[idx, 0, ...] = a
B[idx, 1, ...] = b
etc

填充后重塑数组很简单。即使转置轴也不会太耗时。