0%

python-numpy-结构化文件读写

python-numpy

1.常用概念

  1. 对象的副本或视图

    NumPy中,尤其是在做数组运算或数组操作时,返回结果不是数组的副本就是视图。NumPy中,所有赋值运算不会为数组和数组中的任何元素创建副本。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #数组赋值实际上不是为a创建副本
    a = np.array([1234])
    b = a
    b
    # array([1,2,3,4])
    a[2] - 0
    b
    # array([1,2,0,4])

    #数组切片操作返回的对象只是原数组的视图
    c = a[0:2]
    c
    # array([1,2])
    a[0] = 0
    c
    # array([0,2])

    切片操作得到的结果,实际上仍指向相同的对象。如果想为原数组生成-份完整的副本,从而得到一个不同的数组,使用copy()函数即可。

  2. 向量化

    向量化和广播这两个概念是NumPy内部实现的基础。有了向量化,编写代码时无需使用显式循环。这些循环实际上不能省略,只不过是在内部实现,被代码中的其他结构代替。向量化的应用使得代码更简洁,可读性更强。

    1
    2
    # NumPy中两个数组相乘可以表示为:
    a * b
  3. 广播机制

    广播机制这一操作实现了对两个或以上数组进行运算或用函数处理,即使这些数组形状并不完全相同。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须要满足一定的条件。

    广播机制满足条件:两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为一维。如果这两个条件都不能满足,NumPy就会抛出异常,说两个数组不兼容。

    规则:第一条是为缺失的维度不上个1;第二条是假定缺失元素(一维)都用已有的值进行填充image-20220913154054683

2.结构化数组

它包含的是结构或记录而不是独立的元素。

创建一个简单的结构化数组,其中元素为结构体。你可以用dtype选项,指定一系列用逗号隔开的说明符,指明组成结构体的元素及它们的数据类型和顺序。

1
2
3
4
5
6
7
structured = np.array([(1,'First',0.5,1+2j),(2,'Second', 1.3,2-2j),(3,'Third', o.8,1+3j)],dtype=('i2,a6,f4,c8'))
structured
# array([(1,'First ', o.5,(1+2j)),
# (2, 'Second', 1.2999999523162842,(2-2j)),
# (3,'Third', 0.800000011920929,(1+3j))],
#dtype=[( ' fo ', '<i2'),( 'f1', 'S6'),( 'f2 ', '<f4'),#('f3 ', '<c8')])

自动赋给结构体每个元素的名称可以看成数组列的名称。用它们作为结构化索引,就能引用类型相同或是位于同列的元素。

1
2
structured[ 'f1']
array(['First', 'Second' , 'Third'],dtype='|S6')

image-20220913155546176

4.数组数据文件的读写

NumPy提供了几个函数,数据分析师可用其把结果保存到文本或二进制文件中。类似地,NumPy还提供了从文件中读取数据并将其转换为数组的方法。

  1. 二进制文件的读写

    NumPy的save()方法以二进制格式保存数据,load()方法则从二进制文件中读取数据。

    假如你有一个数组要保存,例如数据分析过程产生的结果,调用save()函数即可,参数有两个 : 要保存到的文件名和要保存的数组,其中文件名中的.npy扩展名系统会自动添加。

    1
    2
    3
    4
    5
    6
    data
    #array([[ 0.86466285, 0.76943895,0.22678279],
    #[ 0.12452825,0.54751384,0.06499123],
    #[ 0.06216566,0.85045125,0.92093862],
    #[0.58401239,0.93455057,0.28972379]])
    np.save( 'saved _data',data)

    若要恢复存储在.npy文件中的数据,可以使用load()函数,用文件名作为参数,这次记得添加.npy扩展名。

    1
    2
    3
    4
    5
    6
    7
    # 若要恢复存储在.npy文件中的数据,可以使用load()函数,用文件名作为参数,这次记得添加.npy扩展名。
    loaded_data = np.load(' saved_data.npy ')
    loaded data
    #array([[0.86466285,0.76943895,0.22678279],
    # [0.12452825,0.54751384,0.06499123],
    # [0.06216566,0.85045125,0.92093862],
    # [o.58401239,0.93455057,0.28972379]])
  2. 读取文件中的列表形式数据

    NumPy的genfromtxt()函数可以从文本文件中读取数据并将其插入数组中。通常而言,这个函数接收三个参数:存放数据的文件名、用于分割值的字符和是否含有列标题。在接下来这个例子中,分隔符为逗号

    1
    2
    3
    data = np.genfromtxt('data.csv',delimiter=',' ,names=True)
    data
    #array([(1.0,123.0,1.4,23.0),(2.0,110.0,0.5,18.0),(3.o,164.0,2.1,19.0)],dtype=[('id', '<f8'),( 'value1', '<f8'),( 'value2 ' , 'if8'),( 'value3', '<f8')])

    从输出结果可以看到,我们得到了一个结构化数组,各列的标题变为各字段的名称。这个函数其实包含两层隐式循环:第一层循环每次读取一行;第二层循环将每一行的多个值分开后,再对这些值进行转化,依次插入所创建的元素。这个函数的优点是它能处理文件中的缺失数据。

    genfromtxt()是怎样把内容为空的项填充为nan值的。