我正在编写代码以沿numpy数组的长度添加数据(用于组合卫星数据记录)。为了做到这一点,我的代码读取两个数组,然后使用函数
def swath_stack(array1, array2):
"""Takes two arrays of swath data and compares their dimensions.
The arrays should be equally sized in dimension 1. If they aren't the
function appends the smallest along dimension 0 until they are.
The arrays are then stacked on top of each other."""
if array1.shape[1] > array2.shape[1]:
no_lines = array1.shape[1] - array2.shape[1]
a = np.zeros((array2.shape[0], no_lines))
a.fill(-999.)
new_array = np.hstack((array2, a))
mask = np.zeros(new_array.shape, dtype=int)
mask[np.where(new_array==-999.)] = 1
array2 = ma.masked_array(new_array, mask=mask)
elif array1.shape[1] < array2.shape[1]:
no_lines = array2.shape[1] - array1.shape[1]
a = np.zeros((array1.shape[0], no_lines))
a.fill(-999.)
new_array = np.hstack((array1, a))
mask = np.zeros(new_array.shape, dtype=int)
mask[np.where(new_array==-999.)] = 1
array1 = ma.masked_array(new_array, mask=mask)
return np.vstack((array1, array2))
在行中创建两个数组
window_data = swath_stack(window_data, stack_data)
如果所考虑的数组的宽度相等,则swath_stack()函数将减少为np.vstack()。我的问题是我在这个阶段遇到了MemoryError
。我知道在算术运算符的情况下,在适当的位置进行算术(即array1 += array2
而不是array1 = array1 + array2
)会更节省内存,但我不知道如何避免这种使用我的swath_stack()函数时出现内存问题。
有人可以帮忙吗?
答案 0 :(得分:1)
我将您的最后一行更改为np.ma.vstack
,然后
In [474]: swath_stack(np.ones((3,4)),np.zeros((3,6)))
Out[474]:
masked_array(data =
[[1.0 1.0 1.0 1.0 -- --]
[1.0 1.0 1.0 1.0 -- --]
[1.0 1.0 1.0 1.0 -- --]
[0.0 0.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 0.0 0.0]
[0.0 0.0 0.0 0.0 0.0 0.0]],
mask =
[[False False False False True True]
[False False False False True True]
[False False False False True True]
[False False False False False False]
[False False False False False False]
[False False False False False False]],
fill_value = 1e+20)
这会保留您在填充期间创建的屏蔽。
屏蔽填充将中间数组的内存使用量加倍。
使用2个相同大小的数组时会出现内存错误吗?即只有普通vstack
?没有办法进行就地堆叠。它必须创建一个或多个新数组。数组具有固定的大小,因此无法就地生长。并且最终数组必须具有连续的数据缓冲区,因此不能使用原始缓冲区。
它不会使用屏蔽,但np.pad
可能会使填充更容易。