• numpy文件读写的三对函数


    在Python很多库中,使用文件名的地方都可以使用文件对象来替代。
    在下述三种方法中,都是如此。

    一、a.tofile()和np.fromfile()

    numpy中的ndarray对象有一个函数tofile(文件名,sep=None),如果指明sep参数,以文本形式打开文件;没有指明sep参数,以二进制形式打开文件。
    这种方式的特点如下:

    • 无格式
    • 默认使用二进制,指明sep参数则以文本方式读写文件
    • 不保留数组类型、形状信息
    • 最节省空间
    • 因为最简单,所以更便于交流
    • 在读入文件时,需要指明dtype
    import numpy as np
    a=np.array([1,2,3]) 
    a.tofile("haha.bin")#12B
    print(a.nbytes)#输出12
    b=np.fromfile("haha.bin",np.int)
    print(np.all(b==a))#输出True
    a.tofile("haha.txt",sep="$")#使用sep参数则以文本方式写入文件
    c=np.fromfile("haha.txt",sep="$")
    print(np.all(c==a))
    

    二、np.save()和np.load()

    • 这是有格式的输出,它能保留数组的类型和形状信息
    • 只能输出一个数组,若要输出多个数组可以使用np.savez(文件名,数组1,数组2....)
    • save()保存之后后缀名为npy,savez()保存之后后缀名npz
    • 使用解压程序打开npz文件可以看到里面是若干个以“数组名称”命名的npy格式的文件,数组名称默认为“arr_数字”的形式,可以指明savez()参数名称来命名数组
    import numpy as np
    a=np.array([1,2,3])
    b=a.copy()
    c=a.copy()
    np.save("haha",a)#只能保存一个数组,文件名自动加npy后缀
    np.savez("haha",a,b,c=c)#只打包不压缩,文件名自动加npz后缀
    np.savez_compressed("haha.compress",a,b,c=c)#先打包,再压缩,文件名自动加npz后缀
    x=np.load("haha.npy")#得到ndarray对象
    y=np.load("haha.npz")#得到一个字典,dict对象
    z=np.load("haha.compress.npz")#得到一个字典,dict对象
    print(x)
    for i in y:
        print(i,y[i])
    print(z.keys())
    print(y.items())
    

    np.save()函数的参数为:np.save(file,arr,allow_pickle,对象aingshifix_imports)

    • allow_pickle表示是否允许numpy使用pickle的方式来序列化对象,默认为True。
    • fix_imports参数用于兼容版本问题,用于Python3的代码导出兼容Python2的pickle。

    在Python中,在有些情形下不鼓励使用pickle,这处于以下两点考虑:

    • 兼容性:不跨平台,因为pickle读入时一读入就是一个对象,这个对象所依赖的包在反序列化时不一定存在
    • 安全性:pickle文件中可以植入代码,造成反序列化时很危险

    三、np.loadtxt和np.savetxt:读写一维或者二维的文本文件

    可以用这两个函数来读写字符串。

    import numpy as np
    a=np.array(["one",1,3])#如果数字、字符串混合,默认为字符串类型
    print(a.dtype,type(a))
    
    a=np.tile("only unicode is allowd".split(),(4,1))
    np.savetxt("haha.txt",a,fmt="%s")#fmt默认为%.18e(也就是浮点数)
    print(np.loadtxt("haha.txt",dtype=np.str))
    

    loadtxt和savetxt可以方便地用来读写csv文件。下面看一个复杂点的例子,这个例子讲了savetxt和loadtxt的参数。

    import numpy as np
    import pickle
    a = np.arange(12).reshape(4, 3)
    np.savetxt(fname=open("haha.txt", "wb"),  # 使用文件名或者file对象都可以,但必须是二进制形式打开
               X=a,  # 准备写入的对象
               fmt="%s",  # 写入数据的格式,可以制定一个format数组,如["%s","%d"]
               delimiter=",",  # 分隔符
               newline="
    
    ",  # 换行符
               header=",".join("age sex height ".split()),  # 头部
               footer="this is the end",  # 底部
               comments="//")  # 注释,默认头部和底部都是被注释了的
    b = np.loadtxt(fname="haha.txt",
                   dtype=np.str,
                   comments="//",
                   delimiter=",",
                   # 传入的是bytes类型的对象
                   converters={0: lambda x: "age={}".format(x.decode("utf8")),
                               1: lambda x: "sex={}" .format(x.decode("utf8")),
                               2: lambda x: "height={}" .format(x.decode("utf8")),
                               },
                   skiprows=2,  # 跳过前x行,这里的x就是需要跳过的行数
                   usecols=[0, 1, 2],  # 需要读取哪几列
                   unpack=False,  # 是否按照列进行解压
                   ndmin=0)  # 返回的数组至少具有的维数(如果不足,会补维)
    print(open("haha.txt").read())
    print(b)
    # 使用unpack
    age, sex, height = np.loadtxt(
        fname="haha.txt", 
        dtype=np.int, 
        comments="//", 
        delimiter=",", 
        unpack=True#使用unpack参数直接把各列解压
        )
    print(age)
    print(height)
    
    

    参考资料

    官方文档
    奋斗的珞珞

  • 相关阅读:
    Java Concurrency
    Java Concurrency
    Java Concurrency
    Java Concurrency
    Java Concurrency
    Java Concurrency
    Java Concurrency
    Java Concurrency
    存储的瓶颈(2)
    存储的瓶颈(3)
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7911670.html
Copyright © 2020-2023  润新知