MemoryError в numpy.delete - PullRequest
       11

MemoryError в numpy.delete

0 голосов
/ 22 февраля 2019

Я загружаю некоторые данные из базы данных, сохраняю их в массиве и выполняю некоторую очистку массива на основе содержимого определенного столбца.Это мой код, который я использую для удаления некоторых строк:

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в файл, затем прочитайте этот файл и выполните очистку, эта ошибка больше не отображается.Решения этого вопроса Есть ли способ удалить определенные элементы массива numpy "In-place" в python: не помогает.Как удалить с inplace = True, а также позаботиться о проблеме с памятью?Может кто-нибудь, пожалуйста, помогите?Заранее спасибо.

1 Ответ

0 голосов
/ 22 февраля 2019

np.delete принимает несколько маршрутов в зависимости от характера массива obj.В этом случае, когда он генерируется where и, следовательно, является массивом индексов для удаления, он принимает следующий маршрут:

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

То есть он создает логическую маску True и устанавливаетвыбранные элементы в ложь.arr[tuple(slobj)] - немного более общая версия для обработки параметра оси.Но в вашем случае ось равна 0, поэтому я могу упростить ее до [msk,:].

Так что msk - это просто 1-й логический размер числа строк вашего data.

np.delete(target_data,pos_to_delete,axis=0) вернет столбец target_data минус удаления, довольно маленький 1d массив.

np.delete(data, ...) вернет массив сопоставимого размера с data, минус сколько бы вы ни удалили.

Это заставляет меня думать, что ваш data настолько велик, что едва ли есть место для каких-либо вычислений с ним, даже что-то настолько простое, как создание копии.

...