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

本文详细介绍了如何使用NumPy的savetxt函数来保存不同类型的数组数据。包括单个文件的一行或多行数据保存方法,多行/列数据的保存方式,以及如何处理高维数据的保存问题。
该文章已生成可运行项目,

官网解释: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)
    在这里插入图片描述
本文章已经生成可运行项目
<think>我们分析用户的问题:用户想了解关于代码`np.savetxt(folder_path+'/Temp_pred.txt', np.squeeze(np.array(Temp_pred)), fmt='%.2f')`的相关信息,可能是使用方法、报错解决等。 ### 一、代码功能解析 该代码使用NumPy的`savetxt`函数将数组数据保存为文本文件: ```python np.savetxt( fname=folder_path+'/Temp_pred.txt', # 文件路径 X=np.squeeze(np.array(Temp_pred)), # 保存数组(经过降维处理) fmt='%.2f' # 数据格式:保留两位小数 ) ``` #### 关键参数说明: 1. **`fname`**:文件路径字符串 - 示例:`./results/Temp_pred.txt` 2. **`X`**:待保存数组 - `np.array(Temp_pred)`:将输入数据转换为NumPy数组 - `np.squeeze()`:删除数组维度为1的轴(如将形状(100,1)变为(100,)) 3. **`fmt`**:数据格式控制 - `'%.2f'`:浮点数保留两位小数(如`3.14159`保存为`3.14`) ### 二、常见问题及解决方案 #### 问题1:路径不存在导致报错 **报错信息**: ```python FileNotFoundError: [Errno 2] No such file or directory: './results/Temp_pred.txt' ``` **解决方案**: ```python import os # 确保文件夹存在 os.makedirs(folder_path, exist_ok=True) # 递归创建目录[^1] ``` #### 问题2:数组维度不兼容 **报错场景**: ```python ValueError: Expected 1D or 2D array, got 3D array ``` **原因**:`np.savetxt`仅支持一维或二维数组 **解决方案**: ```python # 方法1:使用reshape展平 flat_array = np.array(Temp_pred).reshape(-1, 1) # 转为二维数组 np.savetxt(..., X=flat_array, ...) # 方法2:选择性降维(推荐) squeezed_array = np.squeeze(np.array(Temp_pred)) if squeezed_array.ndim > 2: squeezed_array = squeezed_array.reshape(squeezed_array.shape[0], -1) ``` #### 问题3:数据格式错误 **报错信息**: ```python TypeError: Mismatch between array dtype ('object') and format specifier ('%.2f') ``` **原因**:数组包含非数值类型(如字符串) **解决方案**: ```python # 检查并转换数据类型 if Temp_pred.dtype == object: Temp_pred = Temp_pred.astype(float) # 强制转换为浮点数 ``` #### 问题4:权限不足 **报错信息**: ```python PermissionError: [Errno 13] Permission denied: '/root/Temp_pred.txt' ``` **解决方案**: ```python # 更换可写路径(如当前用户目录) import getpass folder_path = f"/home/{getpass.getuser()}/data" ``` ### 三、高级用法扩展 #### 1.数据保存数组为二维时,每行对应文本文件一行: ```python # 生成示例数据 data = np.array([[1.111, 2.222], [3.333, 4.444]]) # 保存为两数据 np.savetxt('data.txt', data, fmt='%.2f', delimiter=',') # 输出文件内容: # 1.11,2.22 # 3.33,4.44 ``` #### 2. 添加文件头 通过`header`参数添加注释: ```python np.savetxt( 'data.txt', data, fmt='%.3f', header='Time(s)\tTemperature(C)', comments='' # 移除默认的注释符'#' ) ``` ### 四、性能优化建议 对于大型数组(>1GB),建议使用二进制格式: ```python # 保存为二进制文件(体积小、速度快) np.save(folder_path+'/Temp_pred.npy', np.array(Temp_pred)) # 读取时 data = np.load('Temp_pred.npy') ``` ### §§相关问题§§ 1. 如何读取由`np.savetxt`保存的文本文件? 2. 处理超大数组时,除了二进制格式还有哪些优化方法? 3. 如何将多个数组同时保存到同一个文本文件? </think>### `np.savetxt` 函数详解与应用 `np.savetxt(folder_path+'/Temp_pred.txt', np.squeeze(np.array(Temp_pred)), fmt='%.2f')` 是 NumPy 提供的文本数据保存函数,用于将数组数据写入文本文件。以下从功能、参数、常见问题及解决方案进行解析: --- ### 一、核心功能与参数解析 函数原型: ```python np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ') ``` 在您的代码中: 1. **`fname`**:`folder_path + '/Temp_pred.txt'` - 文件路径:需确保 `folder_path` 存在且可写 - **路径问题示例**: ```python # 错误:路径不存在引发FileNotFoundError os.makedirs(folder_path, exist_ok=True) # 修复:创建目录[^1] ``` 2. **`X`**:`np.squeeze(np.array(Temp_pred))` - `np.array(Temp_pred)`:将输入数据转为 NumPy 数组 - `np.squeeze()`:移除长度为 1 的维度(如将 `(100, 1)` 转为 `(100,)`) - **维度问题示例**: ```python # 错误:三维数组无法直接保存 X = np.array(Temp_pred).reshape(-1, 1) # 转为二维数组 ``` 3. **`fmt`**:`'%.2f'` - 格式控制符:保留两位小数(如 `3.14159` → `"3.14"`) - 其他常用格式: | 格式符 | 含义 | 示例输入 | 输出文本 | |--------|---------------|----------|-----------| | `%.0f` | 整数格式 | `3.14` | `"3"` | | `%.4e` | 科学计数法 | `12345` | `"1.2345e+04"` | | `%d` | 整数 | `3.14` | `"3"` | --- ### 二、常见错误与解决方案 #### ❌ 错误 1:**路径权限问题** ```python PermissionError: [Errno 13] Permission denied: '/sys/Temp_pred.txt' ``` **解决方案**: ```python import os if not os.access(folder_path, os.W_OK): folder_path = "/user/writable_path/" # 更换可写路径[^1] ``` #### ❌ 错误 2:**数组维度不兼容** ```python ValueError: Expected 1D or 2D array, got 3D array ``` **解决方案**: ```python # 方案1:展平多维数组 flat_data = np.array(Temp_pred).flatten() # 方案2:保存为多(二维数组) if Temp_pred.ndim > 2: reshaped = Temp_pred.reshape(Temp_pred.shape[0], -1) ``` #### ❌ 错误 3:**数据类型不匹配** ```python TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.2f') ``` **解决方案**: ```python # 确保数据类型为数值型 Temp_pred = np.array(Temp_pred, dtype=float) # 强制类型转换 ``` --- ### 三、高级用法示例 #### 1. **保存数据** ```python # 生成两数据(温度和时间) data = np.column_stack((time_array, Temp_pred)) np.savetxt("data.csv", data, fmt=['%.1f', '%.2f'], delimiter=',') ``` 输出文件内容: ``` 0.0, 25.30 1.0, 25.75 2.0, 26.10 ``` #### 2. **添加文件头注释** ```python header = "Time(s)\tTemperature(C)" np.savetxt("data.txt", data, fmt='%.2f', delimiter='\t', header=header) ``` 输出: ``` # Time(s) Temperature(C) 0.00 25.30 1.00 25.75 ``` --- ### 四、性能优化建议 1. **大数组处理**: ```python # 分块写入(避免内存溢出) with open("large_data.txt", 'w') as f: for chunk in np.array_split(Temp_pred, 100): # 分100块写入 np.savetxt(f, chunk, fmt='%.2f') ``` 2. **二进制替代方案**(速度提升 10 倍+): ```python # 保存.npy格式(保留维度信息) np.save(folder_path + '/Temp_pred.npy', Temp_pred) # 读取时:data = np.load('Temp_pred.npy') ``` --- ###
### 如何使用 `np.column_stack` 将一维元组转换为矩阵 在 NumPy 中,`np.column_stack` 是一种用于将多个一维数组堆叠的方式。它会将输入的一维数组组合成一个多维数组(即矩阵),并将这些数组作为新矩阵的不同。 以下是具体的操作方式以及生成期望输出的示例: #### 示例代码 ```python import numpy as np # 定义两个一维元组 tuple_a = (1, 2, 3) tuple_b = (4, 5, 6) # 转换为 NumPy 数组 array_a = np.array(tuple_a) array_b = np.array(tuple_b) # 使用 column_stack 堆叠 result = np.column_stack((array_a, array_b)) print(result) ``` 运行上述代码后,输出将是: ``` [[1 4] [2 5] [3 6]] ``` 此结果表明,原始的一维元组已成功通过 `np.column_stack` 方法转化为一个二维矩阵形式,其中每一对应于初始的一个一维元组[^1]。 如果仅处理单个一维元组,则可以将其扩展到两维再进行操作。例如: #### 单个元组处理示例 ```python import numpy as np # 定义单一的一维元组 single_tuple = (7, 8, 9) # 转换为 NumPy 数组并调整形状 single_array = np.array(single_tuple).reshape(-1, 1) # 变为 n×1 的向量 # 或者直接使用 column_stack 添加额外维度 result_single = np.column_stack((single_array.flatten(), single_array.flatten())) print(result_single) ``` 这会产生如下输出: ``` [[7 7] [8 8] [9 9]] ``` 这里需要注意的是,当只有一个元组时,可以通过 `.flatten()` 和重新排来模拟多效果[^3]。 对于更复杂的场景,比如需要动态添加更多或者执行其他矩阵运算,可参考相关文档进一步探索[^2]^。 ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值