Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过迭代成批数组来创建多维结果_Python_Numpy - Fatal编程技术网

Python 如何通过迭代成批数组来创建多维结果

Python 如何通过迭代成批数组来创建多维结果,python,numpy,Python,Numpy,我正在迭代一些输入批次,并生成具有形状(BatchSize,X,Y)的结果。BatchSize不一定与我在批上循环相同。我想返回一个输出,它是沿批处理维度的结果的连接版本。在NumPy最优雅的方式是什么 我并不太担心性能,而是要处理累积结果数组的多维性。假设您有足够的内存来保存所有结果,一个好的解决方案是只需预先分配内存: result = np.empty(OUTPUT_SHAPE) i=0 while i < input_tensor.shape[0]: batch_size

我正在迭代一些输入批次,并生成具有形状(BatchSize,X,Y)的结果。
BatchSize
不一定与我在批上循环相同。我想返回一个输出,它是沿批处理维度的结果的连接版本。在NumPy最优雅的方式是什么


我并不太担心性能,而是要处理累积结果数组的多维性。

假设您有足够的内存来保存所有结果,一个好的解决方案是只需预先分配内存:

result = np.empty(OUTPUT_SHAPE)
i=0
while i < input_tensor.shape[0]:
    batch_size = get_batch_size(i)
    result[i:i+batch_size] = deal_with_batch(input_tensor[i:i+batch_size])
    i += batch_size
result=np.empty(输出形状)
i=0
而i
是正确的。然而,我一直在寻找增量版本,我想我已经找到了:

定义
results=np.empty((0,output\u shape))
然后在循环中使用
results=np.concatenate((results,some\u func(x)))更新它。


我不确定我应该如何在numpy中考虑大小为0的维度,但它是有效的。

在移动设备上合成的。。。请原谅任何语法错误。:)可能是重复的哦,上帝,不要再问这个问题了。由于无法正确地预分配,最好的方法是在一个普通Python列表中累积子数组,然后在最后将所有子数组连接在一起。有很多QA线程都有可能进行优化,但是我描述的
cat
方法几乎和它们中的任何一个都一样好。注意这个解决方案,因为它有二次运行时。更好的方法是
。将每个
结果
追加到
列表
,然后在末尾将它们串联一次。要详细说明,
np.concatenate
调用必须分配一个全新的数组,并对当前
结果
矩阵执行memcpy。每个批次都会发生这种情况,
结果
矩阵每次都会增长。因此,我们先存储1批,然后存储2批,然后存储3批,以此类推。
sum(range[n])
~n^2。i、 例如,随着批处理数量的增加,此解决方案的扩展性将非常差。根据性能,通常建议在列表中收集阵列,并在最后执行一个
串联。增量的
串联
有两个主要问题-创建起始数组不像
alist=[]
那么简单(正如您所发现的),以及速度(它每次创建一个新数组时都会使用完整副本)。List
append
只添加一个指向列表的指针,而不是一个全新的数组。