python numpy.savetxt(),np.column_stack保存(多行/列)数据 保存多维数组

17 篇文章 0 订阅

官网解释:https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

第一部分: 保存单个文件为一行/列

numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)[source]

说明

fname:表示要保存文件的地址,可以自己建文件名,如‘test.txt’
X:表示要保存的文件
delimiter :分隔符,默认空格,也可以用逗号等
newline:表示换行的时候用什么,默认\n,表示换一行,也可以用\t,则表示空四格
header:表示头文件,如“test_data"
footer: 文件下的脚注
comment:注释,默认是#,因为python的注释是#,也可以用其它符号

更多参见官网

fname可以是一个文件路径,比如要保存在/home/test/text.txt,(注意一定要先建一个空的text.txt文件,好吧,似乎不需要, 更新:对于文件而已是不需要的,会自动在运行目录下建文件),fmt是存储的格式,比如

%d  #整型
%.2f #浮点型保留两位小数
delimiter  #分隔符,默认是一个空格

举例:
保存一列数

import numpy as np

data = np.arange(10)
np.savetxt('myfile.txt',data,fmt='%d',header='oder_data')

可见有头文件,且是整型数据
在这里插入图片描述
如果上面的代码改为:

import numpy as np

data = np.arange(10)
np.savetxt('myfile.txt',data,fmt='%d',header='oder_data',newline='\t',footer='this is test file',
           comments='&&')

则结果是

在这里插入图片描述
要保存2*2矩阵

mymatrix = mat([[1,2],[2.3,4.4]])
np.savetxt(r'/home/test/text.txt',mymatrix,fmt='%.2f')

结果如下:
这里写图片描述
当然也可以第一列为整数,第二列为保留两位小数,只要将上面改为:

fmt='%d %.2f'  #注意是空格,如果是逗号则列之间以逗号隔开,分号,句号等等则以分号,句号隔开

例外,可以将空格改为逗号隔开,即

np.savetxt(r'/home/test/text.txt',mymatrix,fmt='%.2f',delimiter=",")  #或逗号之后加空格,即", "

另外,也可以将mymatrix改为np.column_stack(mymatrix)即将所有数据都列为一行。

第二部分:保存多行/列数据

相同维数

例:
生成列:np.column_stack()扩展列

import numpy as np
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = np.array([9,10,11,12])
np.savetxt(r'/home/test.txt', np.column_stack((a,b,c)),fmt='%d')
#第一列和第二列为整数,第三列保留4位小数
#np.savetxt(r'/home/test.txt', np.column_stack((a,b,c)),fmt='%d %d %.4f')
>>>cat test.txt
1 5 9
2 6 10
3 7 11
4 8 12

这里写图片描述
这里写图片描述
上面是将a,b,c生成列,要求a,b,c都是相同的行数。
提取的时候使用:

data = np.loadtxt(r'/home/test.txt')
#提取第一行
data[0,:] #or data[0]
#提取第一列
data[:,0]
生成行:np.row_stack()扩展行
import numpy as np
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = np.array([9,10,11,12])
np.savetxt(r'/home/test.txt',(a,b,c),fmt='%d')


1 2 3 4
5 6 7 8
9 10 11 12

虽然看上去12跟上面的8,4不在一行,但实际上是同一行的。
上面同样要求a,b,c里面的维数相同。

第三部分:保存多个数组为一行/列

np.savetxt(r'/home/test.txt',np.r_[a,b,c],fmt='%d')
#or
#通过改成list相加,注意不能用array相加,否则会将数据相加
#np.savetxt(r'/home/test.txt',(list(a)+list(b)+list(c)),fmt='%d')
1
2
3
4
5
6
7
8
9
10
11

第四部分:保存高维数据

上面所述的方法都是只适合保存2维或者以下的数据,如果要保存高维数据,则需要使用其他方法。
一种方法是通过降维,将三维或者高维降到二维,但是以后导入不好处理,需要重新组合。
这个话题下有很多解答的方法,以下我采用了几种
方法1,使用numpy.save和numpy.load
现在我有三维数据,(3,3,5)表示有三维,每一维都是三行五列的数组
在这里插入图片描述
在这里插入图片描述
显然使用np.loadtxt和savetxt不适用(它们都不能高于2维),因此可以使用np.load和np.save
在这里插入图片描述
说明:上面保存为test.npy,因为load只能读取npy,npz的文件,所以实际上np.save会默认保存为.npy文件,所以可以只写np.save(‘test’,data),得到的文件名为test.npy。如果保存为np.save(‘test.txt’,data),则得到的是test.txt.npy,只有当保存为np.save(‘test’,data)或者np.save(‘test.npy’,data)的时候得到的才是test.npy.
值得注意的是,不能保存为test.txt,因为txt是通过loadtxt读取的,通过load读取会出错

推广到实际情况,比如上面的三维,每一维度表示一个频率,一个频率有三张图(I,Q,U),则data[0]表示频率 ν 0 \nu_0 ν0对应的(I,Q,U)maps.

补充:matlab读取和保存npy文件

上面保存的.npy文件无法直接被matlab读取,如果要让matlab读取.npy文件,则可以下载github上的开源代码,这个代码不需要安装,只需要加载到路径上即可。
方法如下:

  • 1 下载代码解压
  • 2 matlab路径指定到解压的路径下(这里我将下载解压后的文件移动到matlab/setup/bin下了)
    在这里插入图片描述
  • 3,在命令行addpath和savepath 在这里插入图片描述
  • 4 读取文件,使用readNPY
    在这里插入图片描述
  • 5 保存.npy文件
    使用writeNPY(var,filename)
    在这里插入图片描述
  • 22
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值