加快数组处理的想法
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
填充后重塑数组很简单。即使转置轴也不会太耗时。
我想通过处理数据集 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
填充后重塑数组很简单。即使转置轴也不会太耗时。