使用列表推导式创建NumPy数组时,范围超过9后数组形状异常的问题解决及原因分析
问题分析与修复方案:列表推导式生成NumPy数组形状异常
问题原因拆解
你遇到的这个形状异常问题,核心是子列表长度不一致导致NumPy无法生成规则的二维数组。仔细看你的DataFrame就能发现:第10行(索引9)的Creditor列值是Tata Capital——这是个带空格的字符串。当你用to_string(index=False).split()处理这一行时,split()会把空格当成分隔符,把Tata Capital拆成两个独立元素,导致这一行生成的子列表比其他行多1个元素(其他行的Creditor都是单个单词,拆分后是6个元素,这一行变成了7个)。
- 当遍历
range(9)时,所有行的拆分结果长度一致,NumPy能正常创建(9,6)的二维数组; - 当遍历
range(10)时,出现了长度不一致的子列表,NumPy就会退而创建一个一维的object类型数组(每个元素是长度不同的列表),所以形状变成了(10,)。
修复方案
推荐直接用pandas原生的转换方法,完全避开字符串拆分的坑,有两种靠谱的方式:
方案1:直接将指定行转换为NumPy数组(最推荐)
不需要繁琐的列表推导和字符串拆分,直接用iloc选取行后调用to_numpy(),能完美保留原数据结构:
import pandas as pd import numpy as np sep_payment = pd.DataFrame({ "Creditor":['Axis','RBL_CC','KOTAK_PL','KOTAK_CC','Cashe','SBI','HDFC_Jumbo','HDFC_CC','SCB','Tata Capital','Flex_Salary'], "Priority":[1,2,3,4,5,6,7,8,9,10,11], "Payment_Status":['Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending'], "Credit_Status":['Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending','Pending'], "Payment_Date":['-','-','-','-','-','-','-','-','-','-','-'], "Time Taken in Days":[2,5,5,2,5,2,5,5,5,5,2] }) # 处理前10行,直接转换为NumPy数组 data = sep_payment.iloc[:10].to_numpy() print(data.shape) # 输出 (10, 6)
方案2:如果一定要用列表推导式
如果你坚持要手动遍历每一行,可以直接提取行的原始值,避免转字符串拆分:
subb2 = [sep_payment.iloc[i].values.tolist() for i in range(10)] data = np.array(subb2) print(data.shape) # 输出 (10, 6)
这个方法的原理是:sep_payment.iloc[i].values会直接获取该行的原始数据,Tata Capital会被保留为一个完整的字符串元素,不会被拆分,所以每个子列表长度都是6,NumPy能正常生成二维数组。
总结
本质上,to_string()+split()的方式会破坏带空格字段的完整性,导致子列表长度不一致。用pandas原生的转换方法不仅更高效,还能避免这类格式问题。
内容的提问来源于stack exchange,提问作者Jenish Tilak
相关产品推荐
相关产品推荐

