numpy.delete中的MemoryError

numpy.delete中的MemoryError,numpy,memory,python-3.6,Numpy,Memory,Python 3.6,我正在从数据库下载一些数据,存储在一个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 dat

我正在从数据库下载一些数据,存储在一个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-如果我从数据库中获取数据并dunp到一个文件,然后读取这个文件并执行清理,这个错误不再显示。 这个问题的解决办法 你帮不上忙。如何使用inplace=True进行删除并同时处理内存问题? 有人能帮忙吗?
请提前感谢。

np.delete
根据
obj
数组的性质采取几种路由。在这种情况下,如果它是由
生成的,其中
,因此是一个要删除的索引数组,则它采用以下路径:

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
只是一个1d布尔值,即
数据的行数大小

np.delete(target\u data,pos\u to\u delete,axis=0)
将返回
target\u data
列减去deletes,这是一个相当小的1d数组

np.delete(data,…)
将返回一个与
data
大小相当的数组,减去删除的数量


这让我觉得你的
数据
太大了,几乎没有空间用它做任何计算,甚至像复制这样简单的事情。

delete
创建将返回结果的数组时,会产生错误。然后,它打算用源中的“keeper”值填充它
delete
始终返回一个新数组。看起来其他对象(如源数据帧)占用了大量内存,留给进一步操作的内存很小。
target_data
pos_to_delete
的大小(形状)是多少?数据形状是(5L,40),因此目标数据(5L,1)似乎不足以导致内存错误。那么解决方案是什么呢?