将1D NumPy数组转为673×353的2D文本/ASCII文件报错求助
解决1D数组转指定行列2D数组并保存为文本文件的问题
需求说明
拥有一个名为simulation的1D NumPy数组,包含237,569个数值元素,需要将其转换为673行353列的2D数组,并保存为格式对齐的文本/ASCII文件。格式示例如下:
原1D数组:
[1 2 3 4 5 6 7 8 9 10 11 12]期望转为:
1 2 3
4 5 6
7 8 9
10 11 12
问题重现
尝试以下代码时触发错误:
import numpy as np import pandas as pd simulation = pd.read_csv("simulation.csv",header=None) simulation_array = np.reshape(simulation, (673, 353)) # Save the array to a text file np.savetxt("simulation_2D.txt", simulation_array, fmt="%d", delimiter=" ")
错误信息:
Traceback (most recent call last): File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\internals\managers.py", line 1671, in create_block_manager_from_blocks make_block(values=blocks[0], placement=slice(0, len(axes[0]))) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\internals\blocks.py", line 2744, in make_block return klass(values, ndim=ndim, placement=placement) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\internals\blocks.py", line 131, in __init__ f"Wrong number of items passed {len(self.values)}, " ValueError: Wrong number of items passed 353, placement implies 1 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\hp\Desktop\pythonProject1\main.py", line 7, in <module> simulation_array = np.reshape(simulation, (673, 353)) File "<__array_function__ internals>", line 6, in reshape File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\fromnumeric.py", line 299, in reshape return _wrapfunc(a, 'reshape', newshape, order=order) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\fromnumeric.py", line 55, in _wrapfunc return _wrapit(obj, method, *args, **kwds) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\fromnumeric.py", line 48, in _wrapit result = wrap(result) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\generic.py", line 1790, in __array_wrap__ return self._constructor(result, **d).__finalize__( File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\frame.py", line 497, in __init__ mgr = init_ndarray(data, index, columns, dtype=dtype, copy=copy) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\internals\construction.py", line 234, in init_ndarray return create_block_manager_from_blocks(block_values, [columns, index]) File "C:\Users\hp\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\internals\managers.py", line 1681, in create_block_manager_from_blocks raise construction_error(tot_items, blocks[0].shape[1:], axes, e) ValueError: Shape of passed values is (673, 353), indices imply (237569, 1)
错误原因
pd.read_csv读取后返回的是DataFrame对象,而非纯NumPy数组。直接对DataFrame调用np.reshape时,pandas会尝试将重塑后的数组重新包装为DataFrame,但原DataFrame的结构(237569行1列)与目标形状(673行353列)冲突,导致报错。
解决方案
方案一:直接用NumPy读取文件(推荐)
跳过pandas,直接用NumPy读取csv文件得到纯数组,避免DataFrame的结构限制:
import numpy as np # 读取csv文件为1D NumPy数组 simulation = np.loadtxt("simulation.csv", dtype=int) # 重塑为673行353列的2D数组 simulation_2d = simulation.reshape(673, 353) # 保存为对齐格式的文本文件,%3d确保数字按3位宽度对齐 np.savetxt("simulation_2D.txt", simulation_2d, fmt="%3d", delimiter=" ")
方案二:保留pandas读取,先转NumPy数组
如果需要用pandas处理前置逻辑,先将DataFrame转换为纯NumPy数组再重塑:
import numpy as np import pandas as pd # 读取csv为DataFrame simulation_df = pd.read_csv("simulation.csv", header=None) # 将DataFrame扁平化为1D NumPy数组 simulation_array = simulation_df.values.ravel() # 重塑为目标形状 simulation_2d = simulation_array.reshape(673, 353) # 保存文件 np.savetxt("simulation_2D.txt", simulation_2d, fmt="%3d", delimiter=" ")
关键说明
- 使用
fmt="%3d"格式化输出,确保数字按3位宽度对齐,和示例中的格式一致(比如1显示为1,10显示为10)。 - 确认
673 * 353 = 237569,保证元素数量匹配,否则reshape会报错。
内容的提问来源于stack exchange,提问作者maelaynayn el baida
相关产品推荐
相关产品推荐

