如何将形状为[1953,949,13]的3D Numpy数组写入CSV文件?
解决方案:将3D NumPy数组写入CSV,每行对应一个2D切片
针对你需要把形状为[1953,949,13]的3D数组写入CSV,每行对应一个[949,13]的2D子数组的需求,这里提供几种实用的实现方式,你可以根据场景选择:
方法一:将2D子数组展平为单行(最简洁高效)
这种方式把每个2D子数组直接展平成1D序列,每行存储展平后的所有元素,是最适合数据存储的方案,读写效率都很高。
import numpy as np # 替换成你的实际3D数组 arr_3d = np.random.rand(1953, 949, 13) # 打开CSV文件写入 with open('3d_array_output.csv', 'w', newline='') as csv_file: for slice_2d in arr_3d: # 将2D切片展平为1D,转成逗号分隔的字符串 flattened_row = ','.join(map(str, slice_2d.flatten())) csv_file.write(f"{flattened_row}\n")
读取还原方法
如果你之后需要把CSV还原回3D数组,可以这样做:
restored_arr = [] with open('3d_array_output.csv', 'r') as csv_file: for line in csv_file: # 分割字符串并转成数值,重塑为原2D形状 slice_2d = np.array(line.strip().split(','), dtype=np.float64).reshape(949, 13) restored_arr.append(slice_2d) restored_arr = np.array(restored_arr) # 验证形状:应该输出 (1953, 949, 13) print(restored_arr.shape)
方法二:保留2D子数组的结构(可读性更强)
如果希望每行能直观反映原2D子数组的行结构,可以用分号分隔2D子数组的每一行,逗号分隔元素。这种方式可读性更好,但读写效率略低于方法一。
import numpy as np arr_3d = np.random.rand(1953, 949, 13) with open('3d_array_structured.csv', 'w', newline='') as csv_file: for slice_2d in arr_3d: # 先把2D子数组的每一行转成逗号分隔的字符串,再用分号连接所有行 structured_row = ';'.join(','.join(map(str, row)) for row in slice_2d) csv_file.write(f"{structured_row}\n")
对应读取方法
restored_arr = [] with open('3d_array_structured.csv', 'r') as csv_file: for line in csv_file: # 先按分号分割出2D子数组的每一行,再按逗号分割元素 rows = [np.array(row.split(','), dtype=np.float64) for row in line.strip().split(';')] slice_2d = np.vstack(rows) restored_arr.append(slice_2d) restored_arr = np.array(restored_arr) print(restored_arr.shape)
用np.savetxt的替代方案
np.savetxt确实只支持1D或2D数组,但我们可以循环遍历3D数组的每个2D切片,将其展平为1D后再调用np.savetxt写入,适合对精度控制有要求的场景:
import numpy as np arr_3d = np.random.rand(1953, 949, 13) with open('3d_array_savetxt.csv', 'w') as csv_file: for slice_2d in arr_3d: # 把展平后的1D数组转成2D的一行,让savetxt可以处理 np.savetxt(csv_file, slice_2d.flatten()[np.newaxis, :], delimiter=',', fmt='%.6f')
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

