Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据列中的NumPy loadtxt哈希字符串_Python_Numpy - Fatal编程技术网

Python 数据列中的NumPy loadtxt哈希字符串

Python 数据列中的NumPy loadtxt哈希字符串,python,numpy,Python,Numpy,我正在尝试加载如下所示的数据集: 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

我正在尝试加载如下所示的数据集:

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]])

我正在寻找一个简短而优雅的解决方案。

这里有一个可能的解决方案,它基于
np.loadtxt()中的
转换器
选项:

更简洁的解决方案将基于
np.genfromtxt()

或者,对于浮点值

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.]])

下面是一个基于
np.loadtxt()
中的
转换器
选项的可能解决方案:

更简洁的解决方案将基于
np.genfromtxt()

或者,对于浮点值

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.]])

非常感谢AGN Gazer,这非常有帮助

关于我的第一种方法,我的新代码如下:

import numpy as np

FileName = 'testhash.txt'

Alldata = np.genfromtxt(FileName, delimiter=',', skip_header=1,
          filling_values=np.nan, encoding='ascii', comments=None)

#### reducing array to the 1rd and 3rd column
Reduceddata = np.stack([Alldata[:,1],Alldata[:,3]], axis=1)

#### removing all rows with nan values
Enddata = Reduceddata[~np.any(np.isnan(Reduceddata), axis = 1)]


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

我认为,这是一个简短而优雅的通用解决方案

非常感谢AGN Gazer,这非常有帮助

关于我的第一种方法,我的新代码如下:

import numpy as np

FileName = 'testhash.txt'

Alldata = np.genfromtxt(FileName, delimiter=',', skip_header=1,
          filling_values=np.nan, encoding='ascii', comments=None)

#### reducing array to the 1rd and 3rd column
Reduceddata = np.stack([Alldata[:,1],Alldata[:,3]], axis=1)

#### removing all rows with nan values
Enddata = Reduceddata[~np.any(np.isnan(Reduceddata), axis = 1)]


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

我认为,这是一个简短而优雅的通用解决方案

loadtxt
genfromtxt
处理任何可以为其提供行的内容。我经常使用字符串列表进行测试,但文件读取器和过滤器也可以工作。因此,您不需要将转换后的行写回临时文件。
loadtxt
genfromtxt
处理任何可以为其提供行的内容。我经常使用字符串列表进行测试,但文件读取器和过滤器也可以工作。因此,不需要将转换后的行写回临时文件。