官网解释: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)