numpy.delete中的MemoryError

时间:2019-02-22 13:52:38

标签: numpy memory python-3.6

我正在从db下载一些数据,存储在numpy数组中,并基于该数组执行一些清理 在特定列的内容上。这是我用来删除某些行的代码:

def clean_data(data,column):
    target_data = data[:,column].astype(int)
    pos_to_delete = np.where(target_data==1)[0]
    data = np.delete(data,pos_to_delete,axis=0)
    return data

我在numpy中遇到以下错误。

Traceback (most recent call last):
File "data_download.py", line 111, in download_data
data = clean_data(data)
File "/home/work/data_clean.py", line 13, in data_clean.py
data = np.delete(data,pos_to_delete,axis=0)
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py", line 4262, in delete
new = arr[tuple(slobj)]
MemoryError

PS-如果我从db和dunp中获取数据到一个文件,然后读取该文件并执行清理,此错误将不再显示。 这个问题的解决方案Is there any way to delete the specific elements of an numpy array "In-place" in python: 没有帮助。如何删除inplace = True并同时解决内存问题? 谁能帮忙吗? 预先感谢。

1 个答案:

答案 0 :(得分:0)

np.delete根据obj数组的性质采取多种路由。在这种情况下,它是由where生成的,因此是要删除的索引数组,它采用以下路线:

def foo1(data, idx):
    msk = np.ones(data.shape[0],bool)
    msk[idx] = False
    return data[msk, :]

那是构造一个布尔掩码True,并将选定的项目设置为False。 arr[tuple(slobj)]是用于处理axis参数的通用版本。但是在您的情况下,轴为0,因此我可以将其简化为[msk,:]

所以msk只是data行数的一维布尔值。

np.delete(target_data,pos_to_delete,axis=0)将返回target_data列减去删除内容,这是一个相当小的一维数组。

np.delete(data, ...)将返回与data类似的大小的数组,减去删除的数组数量。

这使我认为您的data太大,以至于几乎没有任何空间可以进行任何计算,即使是简单的复制操作也是如此。