如何将异构数据 (np.genfromtxt) 作为二维数组加载?
How do I load heterogeneous data (np.genfromtxt) as a 2D array?
我从 numpy.genfromtxt produces array of what looks like tuples, not a 2D array—why? 那里了解到,如果数据不均匀,numpy.genfromtxt
returns 一个 结构化 ndarray。 如何将异构数据加载为二维数组?
例如,一个文本文件的内容是:(除 header 之外的所有项目都是 int
)
# c1 c2 c3 c4 c5
3 4 8 6 8
10 7 6 7 10
5 10 2 1 3
7 6 5 3 6
5 8 5 2 7
1 2 2 10 8
10 5 9 3 8
5 2 4 4 2
使用 np.genfromtxt
、
加载数据
# load data from a text file
table = np.genfromtxt('table.dat', dtype=int, delimiter='\t', names=True, filling_values=0)
print(table.shape)
print(table)
# output
(8,)
[(3, 4, 8, 6, 8) (10, 7, 6, 7, 10) (5, 10, 2, 1, 3) (7, 6, 5, 3, 6)
(5, 8, 5, 2, 7) (1, 2, 2, 10, 8) (10, 5, 9, 3, 8) (5, 2, 4, 4, 2)]
# expecting result
(8, 5)
[[ 7 2 4 9 2]
[ 5 8 1 6 4]
[ 6 3 1 4 10]
[10 10 6 5 5]
[10 4 7 7 1]
[ 1 9 8 6 2]
[ 3 2 3 4 4]
[ 7 5 9 10 6]]
PS:我想保留 header = table.dtype.names
用于其他目的。
在这种情况下使用 pandas 然后将 pandas 数据帧转换为 numpy 矩阵会更容易。
import pandas as pd
foo = pd.read_csv('table.dat', sep='\t')
type(foo)
<class 'pandas.core.frame.DataFrame'>
bar = foo.as_matrix()
array([[10, 7, 6, 7, 10],
[ 5, 10, 2, 1, 3],
[ 7, 6, 5, 3, 6],
[ 5, 8, 5, 2, 7],
[ 1, 2, 2, 10, 8],
[10, 5, 9, 3, 8],
[ 5, 2, 4, 4, 2]])
bar.shape
(7,5)
我得到了这个用于:
import numpy as np
table = np.genfromtxt('table.dat',
dtype=None,
skip_header=1)
这就是它起作用的原因:
- 您应该将连续的空格作为分隔符(默认)而不是制表符(除非您发布的代码段已丢失格式)。
- 您应该让 NumPy 推断
dtype
,而不是使用默认的 float
。
- 要在您的问题中获得所需的输出,您只想跳过 header 列,而不是获取创建结构化
dtype
. 的函数
查看文档:http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.genfromtxt.html 了解更多详情。
我同意 Pandas 如果您主要阅读的是 csv 文件,DataFrame 可能更合适。
您的数据看起来是同构的 - 除了 header 之外都是整数。但是通过说 header=True
你强制它加载它作为结构化数组。看看 dtype
.
尝试skip_header=1
(检查语法)。省略 names
(或设为 false)。
换句话说,您要加载整数,忽略 header 行。
制表符分隔符似乎工作正常。
我从评论中看到您发现了view
转换结构化数组的方法。这为您提供 header 名称和二维视图。
我从 numpy.genfromtxt produces array of what looks like tuples, not a 2D array—why? 那里了解到,如果数据不均匀,numpy.genfromtxt
returns 一个 结构化 ndarray。 如何将异构数据加载为二维数组?
例如,一个文本文件的内容是:(除 header 之外的所有项目都是 int
)
# c1 c2 c3 c4 c5
3 4 8 6 8
10 7 6 7 10
5 10 2 1 3
7 6 5 3 6
5 8 5 2 7
1 2 2 10 8
10 5 9 3 8
5 2 4 4 2
使用 np.genfromtxt
、
# load data from a text file
table = np.genfromtxt('table.dat', dtype=int, delimiter='\t', names=True, filling_values=0)
print(table.shape)
print(table)
# output
(8,)
[(3, 4, 8, 6, 8) (10, 7, 6, 7, 10) (5, 10, 2, 1, 3) (7, 6, 5, 3, 6)
(5, 8, 5, 2, 7) (1, 2, 2, 10, 8) (10, 5, 9, 3, 8) (5, 2, 4, 4, 2)]
# expecting result
(8, 5)
[[ 7 2 4 9 2]
[ 5 8 1 6 4]
[ 6 3 1 4 10]
[10 10 6 5 5]
[10 4 7 7 1]
[ 1 9 8 6 2]
[ 3 2 3 4 4]
[ 7 5 9 10 6]]
PS:我想保留 header = table.dtype.names
用于其他目的。
在这种情况下使用 pandas 然后将 pandas 数据帧转换为 numpy 矩阵会更容易。
import pandas as pd
foo = pd.read_csv('table.dat', sep='\t')
type(foo)
<class 'pandas.core.frame.DataFrame'>
bar = foo.as_matrix()
array([[10, 7, 6, 7, 10],
[ 5, 10, 2, 1, 3],
[ 7, 6, 5, 3, 6],
[ 5, 8, 5, 2, 7],
[ 1, 2, 2, 10, 8],
[10, 5, 9, 3, 8],
[ 5, 2, 4, 4, 2]])
bar.shape
(7,5)
我得到了这个用于:
import numpy as np
table = np.genfromtxt('table.dat',
dtype=None,
skip_header=1)
这就是它起作用的原因:
- 您应该将连续的空格作为分隔符(默认)而不是制表符(除非您发布的代码段已丢失格式)。
- 您应该让 NumPy 推断
dtype
,而不是使用默认的float
。 - 要在您的问题中获得所需的输出,您只想跳过 header 列,而不是获取创建结构化
dtype
. 的函数
查看文档:http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.genfromtxt.html 了解更多详情。
我同意 Pandas 如果您主要阅读的是 csv 文件,DataFrame 可能更合适。
您的数据看起来是同构的 - 除了 header 之外都是整数。但是通过说 header=True
你强制它加载它作为结构化数组。看看 dtype
.
尝试skip_header=1
(检查语法)。省略 names
(或设为 false)。
换句话说,您要加载整数,忽略 header 行。
制表符分隔符似乎工作正常。
我从评论中看到您发现了view
转换结构化数组的方法。这为您提供 header 名称和二维视图。