Python中如何将列表内的numpy数组转为float类型?
列表内numpy数组转float类型的解决方案
问题背景
我是Python新手,正在开发一个小型项目,遇到如下问题:输出的列表中包含numpy数组而非float类型,尝试使用astype(float)进行转换但未生效。以下是我的代码及运行结果:
import numpy as np import scipy.stats as st import numpy.random as rd from IPython.display import Markdown, display import pandas as pd service=['essence','gasoil','lavage','vidange'] #服务列表 prob=[0.5, 0.25, 0.16, 0.09] #各服务的概率(50%、25%、16%、9%) λ = 2 #每分钟平均车辆数 n=1440 #模拟1440分钟 model=st.poisson(λ) #汽油和柴油模拟 e ,g , σ = 2.12,1.99, 0.1 #'e'/'g'为汽油和柴油的平均加油时间 / 'σ'为偏差 m=1 model_e=st.norm(e, σ) model_g=st.norm(g, σ) #代码部分 J=30 #模拟一个月(30天) d=[] #用于转换的列表 #各服务对应的列表 essence=[] gasoil=[] vidange=[] lavage=[] for j in range(J): c=0 #单日车辆数 simulation=model.rvs(n) for i in range(n): c +=simulation[i] #计算每日的车辆总数 commandes=rd.choice(service, c, p=prob) d= commandes.tolist() #commandes是ndarray,转为列表以使用count方法 simulation_e=model_e.rvs(m) simulation_e=simulation_e.astype(float) #尝试用astype(float)将数组转为float但无效 simulation_e=simulation_e*d.count('essence') essence.append(simulation_e) gasoil.append(d.count('gasoil')*model_g.rvs(m)) vidange.append(d.count('vidange')) lavage.append(d.count('lavage')) print(essence) print("\n") print(gasoil) print("\n") print(vidange)
运行结果
[array([3049.02567421]), array([3115.46971158]), array([3057.74798456]), array([3169.46760693]), array([2993.79610725]), array([3075.71865925]), array([3204.53370577]), array([3129.65493394]), array([2975.22631282]), array([2945.63018474]), array([2843.09430445]), array([3314.12357151]), array([2796.23558937]), array([3123.59352839]), array([2983.00360539]), array([2883.79955281]), array([3056.7536885]), array([2556.95916304]), array([3050.10908716]), array([3226.86445445]), array([3282.64925171]), array([2922.09414665]), array([3127.7556254]), array([2901.03020042]), array([3186.59201801]), array([3100.92830043]), array([2920.10972545]), array([3279.21261218]), array([3189.59323404]), array([3120.11085555])] [array([1339.12703414]), array([1354.32216511]), array([1467.59247591]), array([1331.76259858]), array([1397.63279282]), array([1452.76958164]), array([1444.76437058]), array([1301.58913082]), array([1361.35320908]), array([1467.51667652]), array([1572.44383252]), array([1252.75929698]), array([1434.85771546]), array([1487.10124071]), array([1334.69536144]), array([1499.65478204]), array([1513.6470695]), array([1531.20406829]), array([1402.24883398]), array([1464.77013383]), array([1566.69506967]), array([1341.01313426]), array([1364.15290992]), array([1477.4313931]), array([1564.68352222]), array([1622.30631325]), array([1340.63426348]), array([1423.24463625]), array([1577.83964284]), array([1533.9487886])] [268, 247, 260, 246, 276, 263, 284, 270, 265, 280, 279, 244, 281, 247, 283, 257, 248, 241, 259, 240, 250, 237, 273, 273, 288, 256, 272, 254, 259, 279]
解决方案
问题根源
model_e.rvs(m)和model_g.rvs(m)当m=1时,返回的是长度为1的numpy数组(比如array([2.102]))。astype(float)只是把数组内元素的类型转为float,但数组本身还是numpy数组对象,所以append到列表后,元素依然是数组而非单个float值。
修复代码
只需要把单个元素的numpy数组提取为Python原生float,有两种简洁方式:
方式1:使用数组索引[0]
for j in range(J): c=0 #单日车辆数 simulation=model.rvs(n) for i in range(n): c +=simulation[i] #计算每日的车辆总数 commandes=rd.choice(service, c, p=prob) d= commandes.tolist() #commandes是ndarray,转为列表以使用count方法 # 修改essence部分:用[0]取出数组中的单个元素 simulation_e=model_e.rvs(m)[0] simulation_e=simulation_e*d.count('essence') essence.append(simulation_e) # 修改gasoil部分:同样用[0]提取元素 gasoil.append(d.count('gasoil')*model_g.rvs(m)[0]) vidange.append(d.count('vidange')) lavage.append(d.count('lavage'))
方式2:调用.item()方法
.item()是numpy数组的方法,专门用于提取单个元素为Python原生类型:
for j in range(J): c=0 #单日车辆数 simulation=model.rvs(n) for i in range(n): c +=simulation[i] #计算每日的车辆总数 commandes=rd.choice(service, c, p=prob) d= commandes.tolist() #commandes是ndarray,转为列表以使用count方法 # 修改essence部分:用.item()转成float simulation_e=model_e.rvs(m).item() simulation_e=simulation_e*d.count('essence') essence.append(simulation_e) # 修改gasoil部分:用.item()提取元素 gasoil.append(d.count('gasoil')*model_g.rvs(m).item()) vidange.append(d.count('vidange')) lavage.append(d.count('lavage'))
修复后效果
修改后,essence和gasoil列表中的元素都会变成float类型,输出示例:
[3049.02567421, 3115.46971158, 3057.74798456, ...] [1339.12703414, 1354.32216511, 1467.59247591, ...]
内容的提问来源于stack exchange,提问作者AbadAl
相关产品推荐
相关产品推荐

