原文:
numpy.org/doc/1.26/reference/generated/numpy.loadtxt.html
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, quotechar=None, like=None)
从文本文件加载数据。
参数:
fnamefile, str, pathlib.Path, list of str, generator
要读取的文件、文件名、列表或生成器。如果文件扩展名为.gz
或.bz2
,则首先解压文件。注意,生成器必须返回字节或字符串。列表中的字符串或生成器产生的字符串将被视为行。
dtypedata-type, optional
结果数组的数据类型;默认值:float。如果这是一个结构化的数据类型,则结果数组将是一维的,每行将被解释为数组的一个元素。在这种情况下,使用的列数必须与数据类型中的字段数匹配。
commentsstr or sequence of str or None, optional
用于指示注释开始的字符或字符列表。无表示无注释。为了向后兼容,字节字符串将被解码为‘latin1’。默认为‘#’。
delimiterstr, optional
用于分隔值的字符。为了向后兼容,字节字符串将被解码为‘latin1’。默认为空白字符。
1.23.0 版更改:仅支持单字符分隔符。不能使用换行符作为分隔符。
convertersdict or callable, optional
自定义值解析的转换器函数。如果converters可调用,则该函数将应用于所有列,否则必须是一个将列号映射到解析器函数的字典。有关更多详细信息,请参见示例。默认值:None。
1.23.0 版更改:添加了传递单个可调用以应用于所有列的能力。
skiprowsint, optional
跳过第一个skiprows行,包括注释;默认值:0。
usecolsint or sequence, optional
要读取的列,其中 0 表示第一列。例如,usecols = (1,4,5)
将提取第 2、第 5 和第 6 列。默认情况下,None 将导致读取所有列。
1.11.0 版更改:当需要读取单个列时,可以使用整数而不是元组。例如,usecols = 3
与usecols = (3,)
的效果相同。
unpackbool, optional
如果为 True,则返回的数组将被转置,因此可以使用x, y, z = loadtxt(...)
来解包参数。当与结构化数据类型一起使用时,将为每个字段返回数组。默认为 False。
ndminint, optional
返回的数组将至少具有ndmin维。否则,将挤压单维轴。合法值:0(默认)、1 或 2。
1.6.0 版新增。
encodingstr, optional
用于解码输入文件的编码。不适用于输入流。特殊值'bytes'启用了向后兼容的工作方式,以确保在可能的情况下接收字节数组作为结果,并将'latin1'编码的字符串传递给转换器。覆盖此值以接收 Unicode 数组并将字符串作为输入传递给转换器。如果设置为 None,则使用系统默认值。默认值为'bytes'。
1.14.0 版本中新增。
max_rowsint,可选
在skiprows行后读取max_rows行内容。默认情况下为读取所有行。请注意,不包含数据的空行(如空行和注释行)不计入max_rows,但这些行在skiprows中计入。
1.16.0 版本中新增。
1.23.0 版本中的更改:不包含数据的行,包括注释行(例如,以'#'开头的行或通过comments指定的行)不会计入max_rows。
quotecharunicode 字符或 None,可选
用于表示引用项的起始和结束的字符。在引用项中被引号或注释字符的出现将被忽略。默认值为quotechar=None
,这意味着引号支持已禁用。
如果在带引号的字段中发现两个连续的quotechar实例,则第一个将被视为转义字符。请参见示例。
1.23.0 版本中新增。
likearray_like,可选
引用对象,允许创建不是 NumPy 数组的数组。如果传入like
的类似数组支持__array_function__
协议,则结果将由它定义。在这种情况下,它确保创建与通过此参数传入的数组兼容的数组对象。
1.20.0 版本中新增。
返回:
outndarray
从文本文件中读取的数据。
另请参阅
以指定格式处理缺失值的数据加载。
读取 MATLAB 数据文件
注意事项
此函数旨在成为简单格式文件的快速读取器。 genfromtxt
函数提供更复杂的处理功能,例如处理具有缺失值的行。
输入文本文件中的每一行必须具有相同数量的值,才能够读取所有的值。如果所有行的值的数量不相同,则可以通过usecols指定要读取的列的子集(n 为所有行中出现的最少值的数量)。
1.10.0 版本中新增。
由 Python float.hex 方法生成的字符串可用作浮点数的输入。
示例
>>> from io import StringIO # StringIO behaves like a file object
>>> c = StringIO("0 1\n2 3")
>>> np.loadtxt(c)
array([[0., 1.],
[2., 3.]])
>>> d = StringIO("M 21 72\nF 35 58")
>>> np.loadtxt(d, dtype={'names': ('gender', 'age', 'weight'),
... 'formats': ('S1', 'i4', 'f4')})
array([(b'M', 21, 72.), (b'F', 35, 58.)],
dtype=[('gender', 'S1'), ('age', '<i4'), ('weight', '<f4')])
>>> c = StringIO("1,0,2\n3,0,4")
>>> x, y = np.loadtxt(c, delimiter=',', usecols=(0, 2), unpack=True)
>>> x
array([1., 3.])
>>> y
array([2., 4.])
转换器参数用于指定在解析之前对文本进行预处理的函数。转换器可以是将预处理函数映射到每一列的字典:
>>> s = StringIO("1.618, 2.296\n3.141, 4.669\n")
>>> conv = {
... 0: lambda x: np.floor(float(x)), # conversion fn for column 0
... 1: lambda x: np.ceil(float(x)), # conversion fn for column 1
... }
>>> np.loadtxt(s, delimiter=",", converters=conv)
array([[1., 3.],
[3., 5.]])
转换器可以是一个可调用对象,而不是一个字典,此时它将应用于所有列:
>>> s = StringIO("0xDE 0xAD\n0xC0 0xDE")
>>> import functools
>>> conv = functools.partial(int, base=16)
>>> np.loadtxt(s, converters=conv)
array([[222., 173.],
[192., 222.]])
此示例显示了如何使用转换器将带有尾部减号的字段转换为负数。
>>> s = StringIO('10.01 31.25-\n19.22 64.31\n17.57- 63.94')
>>> def conv(fld):
... return -float(fld[:-1]) if fld.endswith(b'-') else float(fld)
...
>>> np.loadtxt(s, converters=conv)
array([[ 10.01, -31.25],
[ 19.22, 64.31],
[-17.57, 63.94]])
将可调用对象用作转换器特别适用于处理具有不同格式的值,例如带有下划线的浮点数:
>>> s = StringIO("1 2.7 100_000")
>>> np.loadtxt(s, converters=float)
array([1.e+00, 2.7e+00, 1.e+05])
这个想法可以扩展到自动处理以许多不同格式指定的值:
>>> def conv(val):
... try:
... return float(val)
... except ValueError:
... return float.fromhex(val)
>>> s = StringIO("1, 2.5, 3_000, 0b4, 0x1.4000000000000p+2")
>>> np.loadtxt(s, delimiter=",", converters=conv, encoding=None)
array([1.0e+00, 2.5e+00, 3.0e+03, 1.8e+02, 5.0e+00])
请注意,默认encoding="bytes"
时,转换器函数的输入是 latin-1 编码的字节字符串。要在转换之前取消隐式编码,请使用encoding=None
。
>>> s = StringIO('10.01 31.25-\n19.22 64.31\n17.57- 63.94')
>>> conv = lambda x: -float(x[:-1]) if x.endswith('-') else float(x)
>>> np.loadtxt(s, converters=conv, encoding=None)
array([[ 10.01, -31.25],
[ 19.22, 64.31],
[-17.57, 63.94]])
通过quotechar参数启用了对引用字段的支持。当注释字符和分隔符字符出现在由quotechar界定的引用项内时,它们将被忽略:
>>> s = StringIO('"alpha, #42", 10.0\n"beta, #64", 2.0\n')
>>> dtype = np.dtype([("label", "U12"), ("value", float)])
>>> np.loadtxt(s, dtype=dtype, delimiter=",", quotechar='"')
array([('alpha, #42', 10.), ('beta, #64', 2.)],
dtype=[('label', '<U12'), ('value', '<f8')])
引用字段可以通过多个空白字符分隔:
>>> s = StringIO('"alpha, #42" 10.0\n"beta, #64" 2.0\n')
>>> dtype = np.dtype([("label", "U12"), ("value", float)])
>>> np.loadtxt(s, dtype=dtype, delimiter=None, quotechar='"')
array([('alpha, #42', 10.), ('beta, #64', 2.)],
dtype=[('label', '<U12'), ('value', '<f8')])
在引用字段中的两个连续引号字符被视为一个转义字符:
>>> s = StringIO('"Hello, my name is ""Monty""!"')
>>> np.loadtxt(s, dtype="U", delimiter=",", quotechar='"')
array('Hello, my name is "Monty"!', dtype='<U26')
当所有行不包含相等数量的值时,读取列的子集:
>>> d = StringIO("1 2\n2 4\n3 9 12\n4 16 20")
>>> np.loadtxt(d, usecols=(0, 1))
array([[ 1., 2.],
[ 2., 4.],
[ 3., 9.],
[ 4., 16.]])