我正在从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并同时解决内存问题? 谁能帮忙吗? 预先感谢。
答案 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
太大,以至于几乎没有任何空间可以进行任何计算,即使是简单的复制操作也是如此。