numpy - QLGQ/learning-python GitHub Wiki

I/O with NumPy

Numpy provides several functions to create arrays from tabular data. We focus here on the genfromtxt function.

genfromtxt函数

genfromtxt函数主要执行两个循环运算:

  • 第一个循环将文件的每一行转换成字符串序列。
  • 第二个循环将每个字符串序列转换为相应的数据类型。

genfromtxt函数创建数组表格数据, genfromtxt能够考虑缺失的数据,但其他更快和更简单的函数像loadtxt不能考虑缺失值。使用前需导入相应模块:

>>> import numpy as np  
>>> from StringIO import StringIO

定义输入

genfromtxt唯一的强制参数是数据的来源。它可以是一个对应于一个本地或远程文件的名字字符串,或一个有read方法的file-like对象(如一个实际的文件或StringIO。StringIO对象)。如果参数是一个远程文件的URL,后者在当前目录中自动下载。输入文件可以是一个文本文件或存档,目前,该函数识别gzip和bz2(bzip2)。归档文件的类型是检查文件的扩展:如果文件名以“.gz”结尾”,gzip存档;如果它结尾是“bz2”,bzip2存档。

将行分割成列

genfromtxt分割每个非空行成一个字符串序列。空的行或注释行跳过。分割符并不局限于单个字符,任何字符串就可以了。分割一个固定宽度的文件,列的宽度被定义为一个给定的字符数。在这种情况下,我们需要将分隔符设置成一个整数(如果所有的列有相同的大小)或一个整数序列(如果列可以有不同的大小)。

>>> data = "123456789\n 4 7 9\n 4567 9"
>>> np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
array([[ 1234.,   567.,    89.],
              [        4.,        7.,       9.],
              [        4.,    567.,      9.]])

autostrip参数

当把一行分割成一个字符串序列,序列中的每一项前后的多余空格还存在,可以将autostrip参数设置为true,去掉空格。

comments参数

comments参数是一个字符串,标志着一个注释的开始符号。默认是"#",在转换过程中注释标记可能发生在任何地方。任何字符出现在在注释标记之后会被忽略。 注意:这种行为有一个例外:如果可选的参数names= True,第一行检查到注释行会被认为是名称。

skip_header和skip_footer参数

一个文件的页眉会阻碍文件的处理。在这种情况下,我们需要使用skip_header可选参数。这个参数的值必须是一个整数,跳过文件开头的对应的行数,然后再执行任何其他操作。同样的,我们通过使用skip_footer属性和n的值可以跳过文件的最后n行。默认值都为0.

usercols参数

在某些情况下,我们只对数据中的某些列感兴趣。我们可以使用usecols选择感兴趣的列。这个参数接受一个整数或一个整数序列作为索引。记住,按照惯例,第一列的索引0,-1对应最后一列。如果列有名称,我们也可以将usecols参数设置为他们的名称,或者包含列名称一个字符串序列或逗号分隔的字符串。

dtype参数

我们从文件读取的字符串序列要转换为其他类型数据时需设置dtype参数。默认是float类型。

  • 单个类型,如dtype =float。
  • 一个序列类型,例如dtype=(int, float, float)。
  • 一个逗号分隔的字符串,例如dtype="i4,f8,|S3"。
  • 一个字典包含两个键‘names’和‘formats’。
  • 一个元组序列,例如dtype = [('A',int),('B',float)]。
  • 一个存在的numpy.dtype对象。
  • 一个特殊的值None,在这种情况下,每个列的类型由自身数据决定。将参数设置成None效率较低。因为它会从布尔值开始检验,然后是整型,浮点型,复数最后是字符串,直到满足条件为止。

names参数

可以将names参数设置为true并跳过第一行,程序将把第一行作为列名称,即使第一行被注释掉了也会被读取。或可以使用dtype设置名称,也可以重写names,默认的names是none,当names=none时,将由numpy产生一些标准默认的值"f%i",我们可以通过defaultfmt改变默认格式。

>>> data = StringIO("1 2 3\n 4 5 6")
>>> ndtype = [('a', int), ('b', float), ('c', int)]
>>> names = ["A", "B", "C"]
>>> np.genfromtxt(data, names=names, dtype=ndtype)
array([(1, 2.0, 3), (4, 5.0, 6)], 
      dtype=[('A', '<i8'), ('B', '<f8'), ('C', '<i8')])

注意:我们需要记住,只有一些名字没有定义时才会使用defaultfmt

验证names

Numpy数组和一个结构化dtype也可以视为recarray,一个字段可以当成一个属性访问。出于这个原因,我们可能需要确保字段名称不包含任何空格或无效的字符,或者不符合标准属性的名称(如size或shape)。genfromtxt接受三个可选参数,提供了一个更好的控制上的名字:

  • deletechars:一个name中所有包含的需要删除的连接符。默认情况下无效字符~!@#$%^&*()——+~=|]}({;:/?>,<。
  • excludelist:给出一系列要删除的name,如return,file,print……如果其中一个输入的名字出现在这个列表中,将会给它附加一个下划线(“_”)。
  • case_sensitive:名字是否应该区分大小写(case_sensitive = True),转换为大写(case_sensitive=False or case_sensitive='upper')或转换为小写(case_sensitive='lower')

converters参数

当我们希望日期的格式MM/DD/YYYY被转换为一个datetime对象,或一个字符串xx%正确地转换为一个浮点数在0和1之间时,需要使用converters参数定义转换函数。 这个参数的值通常是一个以列索引或列名称作为键和一个转换函数作为值的字典。这些转换函数可以是实际的函数或lambda函数。在任何情况下,他们应该只接受一个字符串作为输入和输出和只有一个想要得到的元素类型。

missing_values

默认情况下使用空格表示缺失,我们可以使用更复杂的字符表示缺失,例如'N/A'或'???'。missing_values接受三种类型的值:

  • 一个字符串或逗号分隔的字符串:这个字符串将被用作标记的缺失数据的所有列
  • 一个字符串序列:在这种情况下,按照顺序每一项与对应的列相关联。
  • 一个字典:字典的值是字符串或字符串序列。对应的key可以列索引(整数)或列名(字符串)。此外,key=none定义一个默认值的适用于所有列。

filling_values参数

出现缺失值时,系统默认填充的值:

Expected type        Default
bool                         False
int                           -1
float                        np.nan
complex                  np.nan+0j
string                       '???'

我们也可以像missing_values参数自定义设置参数的值。filling_values接受三种类型的值:

  • 一个单独的值:所有列的默认值
  • 一个序列的值:按照顺序每一项对应相应列。
  • 一个字典:字典的值是一个单独的对象。对应的key可以列索引(整数)或列名(字符串)。此外,key=none定义一个默认值的适用于所有列。

usermask参数

我们可能还想跟踪缺失数据的发生通过构造一个Boolean mask,数据缺失的地方返回true,否则,则返回False。要做到这一点,我们必须设置可选参数usemask=True(默认是False)。结果将输出一个MaskedArray数组。

除了genfromtxt,numpy.lib.io模块提供了一些来自genfromtxt的便捷功能。这些功能都是以相同的方式工作,但他们有不同的默认值。

  • ndfromtxt 通常设置usemask=False.输出通常是一个标准的numpy.ndarray.
  • mafromtxt 通常设置usemask=True. 输出是MaskedArray
  • recfromtxt 返回标准的numpy.recarray (如果usemask=False)或一个MaskedRecords数组(如果usemaske=True).默认的dtype是dtype=None,意味着每一列的类型将自动确定。
  • recfromcsv 类似于recfromtxt, 但delimiter=","。

Array creation

There are 5 general mechanisms for creating arrays:

  1. Conversion from other Python structures (e.g., lists, tuples)
  2. Intrinsic numpy array array creation objects (e.g., arange, ones, zeros, etc.)
  3. Reading arrays from disk, either from standard or custom formats
  4. Creating arrays from raw bytes through the use of strings or buffers
  5. Use of special library functions (e.g., random)

Examples:

>>> x = np.array([1.+0.j, 2.0+0.j], [0.+0.j, 0.+0.j], [1.+1.j, 3.+0.j](/QLGQ/learning-python/wiki/1.+0.j,-2.0+0.j],-[0.+0.j,-0.+0.j],-[1.+1.j,-3.+0.j))  
>>> x
array([[ 1.+0.j,  2.+0.j],
       [ 0.+0.j,  0.+0.j],
       [ 1.+1.j,  3.+0.j]])  
>>> np.arange(2, 3, 0.1)  
array([ 2. ,  2.1,  2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9])  
>>> np.zeros((2, 3))
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

Data types

Numpy supports a much greater variety of numerical types than Python does.

Data type 	Description
bool_ 	Boolean (True or False) stored as a byte
int_ 	Default integer type (same as C long; normally either int64 or int32)
intc 	Identical to C int (normally int32 or int64)
intp 	Integer used for indexing (same as C ssize_t; normally either int32 or int64)
int8 	Byte (-128 to 127)
int16 	Integer (-32768 to 32767)
int32 	Integer (-2147483648 to 2147483647)
int64 	Integer (-9223372036854775808 to 9223372036854775807)
uint8 	Unsigned integer (0 to 255)
uint16 	Unsigned integer (0 to 65535)
uint32 	Unsigned integer (0 to 4294967295)
uint64 	Unsigned integer (0 to 18446744073709551615)
float_ 	Shorthand for float64.
float16 	Half precision float: sign bit, 5 bits exponent, 10 bits mantissa
float32 	Single precision float: sign bit, 8 bits exponent, 23 bits mantissa
float64 	Double precision float: sign bit, 11 bits exponent, 52 bits mantissa
complex_ 	Shorthand foTo convert the type of an array, use the .astype() method (preferred) or the type itself as a function. For example:r complex128.
complex64 	Complex number, represented by two 32-bit floats (real and imaginary components)
complex128 	Complex number, represented by two 64-bit floats (real and imaginary components)

To convert the type of an array, use the .astype() method (preferred) or the type itself as a function. For example:

>>> z = np.arange(3, dtype=np.uint8)
>>> z
array([0, 1, 2], dtype=uint8)
>>> z.astype(float)
array([0., 1., 2.])
>>> np.int8(z)
array([0, 1, 2], dtype=int8)