Документация numpy показывает пример маскирования существующих значений с помощью ma.masked
a posteriori (после создания массива) или создания маскированного массива из списка того, что представляется допустимым типом данных (целое число, еслиdtype=int
).Я пытаюсь прочитать данные из файла (и требует некоторых манипуляций с текстом), но в какой-то момент у меня будет список списков (или кортежей), содержащий строки, из которых я хочу создать числовой (плавающий) массив.
Примером данных может быть textdata='1\t2\t3\n4\t\t6'
(типичный плоский текстовый формат после очистки).
Одна из моих проблем заключается в том, что пропущенные значения могут быть закодированы как '', что при попыткепреобразовать в число с плавающей точкой, используя аргумент dtype, скажет мне
ValueError: setting an array element with a sequence.
Итак, я создал эту функцию
def makemaskedarray(X,missing='',fillvalue='-999.',dtype=float):
arr = lambda x: x==missing and fillvalue or x
mask = lambda x: x==missing and 1 or 0
triple = dict(zip(('data','mask','dtype'),
zip(*[(map(arr,x),map(mask,x)) for x in X])+
[dtype]))
return ma.array(**triple)
, которая, кажется, выполняет свою задачу:
>>> makemaskedarray([('1','2','3'),('4','','6')])
masked_array(data =
[[1.0 2.0 3.0]
[4.0 -- 6.0]],
mask =
[[False False False]
[False True False]],
fill_value = 1e+20)
Это способ сделать это?Или есть встроенная функция?