Вот возможное решение, основанное на опции converters
в np.loadtxt()
:
delimiter = ','
fillval = np.nan
with open('missingval.txt') as f:
ncol = len(f.readline().split(delimiter))
converter = lambda s: fillval if s.strip()[0] == '#' else float(s)
converters = {i: converter for i in range(ncol)}
np.loadtxt('missingval.txt', delimiter=',', comments=None,
converters=converters, skiprows=1, encoding='ascii')
Еще более сжатое решение будет основано на np.genfromtxt()
:
np.genfromtxt('missingval.txt', delimiter=',', dtype=np.int, skip_header=1,
filling_values=0, encoding='ascii', comments=None)
или, для значений с плавающей запятой,
np.genfromtxt('missingval.txt', delimiter=',', skip_header=1,
filling_values=np.nan, encoding='ascii', comments=None)
Пример:
Содержимое 'missingval.txt'
:
MD1,MD2,MD3,MD4,MD5
8,5,6,4,5
5,##,2,8,9
4,9,8,2,4
#i,2,9,7,2
Результат вызова вышеуказанного кода:
In [97]: delimiter = ','
...: fillval = np.nan
...:
...: with open('missingval.txt') as f:
...: ncol = len(f.readline().split(delimiter))
...: converter = lambda s: fillval if s.strip()[0] == '#' else float(s)
...: converters = {i: converter for i in range(ncol)}
...:
...: np.loadtxt('missingval.txt', skiprows=1, delimiter=',', comments=None,
...: converters=converters, encoding='ascii')
Out[97]:
array([[ 8., 5., 6., 4., 5.],
[ 5., nan, 2., 8., 9.],
[ 4., 9., 8., 2., 4.],
[nan, 2., 9., 7., 2.]])