You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

报错TypeError: 'float'对象不可下标——列表与数组问题排查

解决TypeError: 'float' object is not subscriptable错误(Jonswap谱Szeta计算)

错误根源

你的代码触发TypeError: 'float' object is not subscriptable有两处核心问题:

  • omega_p被覆盖为浮点数:初始将omega_p定义为列表,但循环中执行omega_p = (np.pi*2)/(tz[j]*1.285)时,它被重赋值为单个浮点数。后续代码尝试用omega_p[j]访问下标,而浮点数不支持下标操作,直接引发报错。
  • 错误引用omega[j]:omega是一维频率数组,仅对应i索引的频率点,j是平均周期tz的索引,omega[j]完全不符合逻辑,应使用当前循环的峰值频率omega_p而非omega[j]。
  • 额外隐患:初始定义的列表A被循环中赋值为单个浮点数,虽未直接报错,但易引发变量混淆。

修正后的完整代码

import numpy as np
import math
import matplotlib.pyplot as plt
import pandas as pd

omega = np.arange(0.01, 3.1, 0.01)
tz = [4, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]
Hs = 1       # 有效波高,可按需修改
gamma = 3.3  # Jonswap谱的峰形参数,固定为3.3
A_gamma = 1 - (0.287 * math.log(gamma))

# 初始化Szeta数组,维度为(平均周期数, 频率数)
Szeta = np.zeros((len(tz), len(omega)))

for j in range(len(tz)):
    # 计算当前平均周期对应的峰值频率,用独立变量名避免覆盖
    omega_p_j = (2 * np.pi) / (tz[j] * 1.285)
    
    for i in range(len(omega)):
        # 根据频率与峰值频率的关系选择sigma
        if omega[i] <= omega_p_j:
            sigma = 0.7
        else:
            sigma = 0.9
        
        # 计算指数项A,无需用列表存储单个值
        A = np.exp(-((omega[i] - omega_p_j)**2) / (2 * omega_p_j**2 * sigma**2))
        
        # 修正Szeta计算式:替换omega_p[j]为omega_p_j,omega[j]为omega_p_j
        Szeta[j, i] = (A_gamma * (5/16) * Hs**2 * omega_p_j**4 * omega[i]**(-5) 
                       * np.exp((-5/4) * (omega[i]/omega_p_j)**(-4)) * (gamma**A))

关键修改说明

  1. 避免变量覆盖:将循环内的峰值频率命名为omega_p_j,不再复用初始的列表变量omega_p,彻底解决浮点数下标访问错误。
  2. 修正频率比值:把错误的omega[i]/omega[j]改为omega[i]/omega_p_j,符合Jonswap谱的计算公式逻辑。
  3. 清理冗余代码:删除未使用的os、glob、time等库导入,以及未用到的tP列表,简化代码结构。
  4. 优化变量定义:循环内的A直接作为单个浮点数使用,不再依赖初始的列表定义,减少混淆。

内容的提问来源于stack exchange,提问作者Scikky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:02:47