2017-02-22 11 views
0

В массивах Numpy int не сохраняются отсутствующие значения.int array с отсутствующими значениями numpy

>>> import numpy as np 
>>> np.arange(10) 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> myArray = np.arange(10) 
>>> myArray.dtype 
dtype('int32') 

>>> myArray[0] = None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType' 

>>> myArray.astype(dtype = 'float') 
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 
>>> myFloatArray = myArray.astype(dtype = 'float') 
>>> myFloatArray[0] = None 

>>> myFloatArray 
array([ nan, 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

Панда предупреждает об этом в документации - Caveats and Gotchas, Support for int NA. Wes McKinney также повторяет точку в этом stack question

Мне нужно иметь возможность хранить недостающие значения в массиве int. Я INSERTING строк в моей базе данных, которые я настроил, чтобы принимать только ints различных размеров.

Моя текущая работа заключается в том, чтобы хранить массив как объект, который может содержать как ints, так и None-types в качестве элементов.

>>> myArray.astype(dtype = 'object') 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=object) 
>>> myObjectArray = myArray.astype(dtype = 'object') 
>>> myObjectArray[0] = None 
>>> myObjectArray 
array([None, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=object) 

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

+1

Как насчет 'numpy.ma.MaskedArray'? – MSeifert

+0

Интересно. Вы знаете, работает ли это с Пандами? – Nirvan

+1

Это может быть немного взломано. Не можете ли вы назначить назначенное целое число для заполнения этих отсутствующих значений? Вы можете зарезервировать такое целочисленное число, чтобы заполнить только отсутствующие значения. почему вы хотите вставить только «Нет» вместо пропущенных значений? – kmario23

ответ

0

Я нашел очень быстрый способ конвертировать все недостающие значения в моем ядре данных в категории Нет. .where метод

mydata = mydata.where(pd.notnull(mydata), None) 

Это гораздо меньше памяти интенсивнее, чем то, что я делал раньше.

Смежные вопросы