我正在尝试加载看起来像这样的数据集:
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]])
我正在寻找一个简短而优雅的解决方案。
这是基于converters
选项的可能解决方案:
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')
'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.]])