天天看点

excel或者csv文件格式转化成npy或npz格式,npy与npz的关系(numpy的I/O操作)excel或者csv文件格式转化成npy或npz格式npy与npz的关系

excel或者csv文件格式转化成npy或npz格式

步骤很简单,首先需要导入numpy和pandas库

import numpy as np
import pandas as pd
           

然后用pandas将需要转化的excel文件读进来,如果是csv文件就用pd.read_csv(“文件地址\文件名”),下列代码以读取excel文件为例

data = pd.read_excel(r"D:\data\student-score.xls")

前边的小写字母r是用来转义斜杠()的,不用这种方式,将斜杠()全部替换成反斜杠(/)也可以,或者用双斜杠,就是在每个需要转义的斜杠前再加一个斜杠,这样子(\)也是可以的,具体的知识点可以参考转义字符部分.

转换成npy格式

进行文件格式的转换:

np.save(r"D:\data\student-score", data)

运行完这行代码后,一个和原excel文件同名的npy文件就生成在指定文件夹了

转换成npz格式

前边导入numpy和pandas库以及用pandas读取文件的操作都是一样的,进行文件格式转换有一点区别:

np.savez(r"D:\data\student-score", data)

运行完这行代码,一个和原excel文件同名的npz文件就生成在指定文件夹了

以上npy和npz文件都可以用

np.load(r"D:\data\student-score.npy")

读取

但是npy格式的读出来是array

npz格式读出来是这个东东

<numpy.lib.npyio.NpzFile at 0x1bcfec5d940>

这就涉及下边的话题了

npy与npz的关系

从上边代码可以看出,np.save()生成的是npy文件,np.savez()生成的是npz文件,那么这两个只差了一个字母的命令区别到底在哪里呢,生成的文件又有什么不同呢?

先来说np.save(),这个函数的参数要求是要传入的文件或者文件名,再加一个array_like,注意是只加一个!是不是有点明白了?np.save()只能存储一个np.array数组并生成npy文件!

上文中用np.load()读取的文件,虽然读出来的是array,但是缺少列名,只有列名下的值,不知道列名的数据要怎样处理呢?

这就引出了另一个函数np.savez(),这个函数的参数除了要求传入文件或者文件名,后边的参数是不定长的位置参数(*args)和不定长的关键字参数(**kwds),也就是说,可以传入不限数量的array_like,然后把这些array_like打包压缩到一个npz文件中!

既然如此,对于怎样用numpy读取excel文件是不是有了新的思路?把列名(columns)和值(values)分别放在两个excel中,然后用np.savez()函数把他们打包压缩转化成一个npz格式文件,就可以通过这一个npz文件可以同时访问columns和values了。

data1 = pd.read_excel(r"D:\data\student-score-col.xlsx")
data2 = pd.read_excel(r"D:\data\student-score-val.xlsx")
#把两个excel文件打包压缩转换成一个npz文件
np.savez("D:/data/student-score1.npz",data1 , data2 )   
#读取打包压缩后实际包含两个npy文件的npz文件
data_z = np.load(r"D:\data\student-score1.npz")  
data_z
           

返回结果:

<numpy.lib.npyio.NpzFile at 0x25d7a5d9668>

columns = data_z['arr_0'] #这里写arr_0,是因为打包压缩转换的第一个文件的默认名字是arr_0

values = data_z['arr_1'] #第二个文件默认名字是arr_1

这两行代码输出的就是转化成ndarray的列名和值.

另外这里面还有一个小坑,列名和值分别放入两个excel时需要给他们添加一个相同的标题行,否则只放入标题行的文件用npz文件无法读取到信息,只能读到空列表.

继续阅读