NumPy loadtxt хеш-строки в столбцах данных - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь загрузить наборы данных, которые выглядят так:

MD1,MD2,MD3,MD4,MD5
8,5,6,4,5
5,##,2,8,9
4,9,8,2,4
#i,2,9,7,2

и т. Д.Это сильно сокращенный пример, и поэтому мне нужно общее решение.

Форма ненулевых значений (например, «##» и «#i») зависит от измерительного устройства или, скорее, от столбцов.

Зависит от вида оценки, необходимы разные конкретные столбцы, и поэтому сначала необходимо прочитать все данные (также с ненулевыми значениями).

мой уродливый подход:

import os
import numpy as np


FileName = 'testhash.txt'
f1 = open(FileName, 'r')
f2 = open(FileName[:-4] + '.tmp', 'w')
vrn = -9876543210 #very rare number
for line in f1:
        Newline = line.replace('##', str(vrn))
        Newline = Newline.replace('#i', str(vrn))
        f2.write(Newline)
f1.close()
f2.close()

Reduceddata = np.loadtxt(FileName[:-4] + '.tmp', skiprows=1, usecols=(1,3), delimiter=',')
os.remove(FileName[:-4] + '.tmp')

Enddata = Reduceddata[np.all(Reduceddata != vrn, axis=1),:].astype(int)


In [1]:Enddata
Out[1]: 
array([[5, 4],
       [9, 2],
       [2, 7]])

Я ищу короткое и более элегантное решение.

1 Ответ

0 голосов
/ 27 сентября 2019

Вот возможное решение, основанное на опции 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.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...