Bash array iteration

本文介绍了一段使用bash脚本实现的任务,该脚本通过遍历多个参数,包括线程数、文件大小和超时时间,对指定URL下的文件进行批量操作,并记录运行时间和输出结果。
#!/bin/bash

OD=output
URL=http://www.ug.it.usyd.edu.au/~ygao6590/
# T: threads
t=( 1 2 3 )
#t=( 1 )
# F: files
f=( "50k" "100k" "200k" )
#f=( "50k" )
# S: timeout (secs)
s=( 5 10 15 20 25 )
#s=( 5 )

tidx=0
fidx=0
sidx=0

while [ "$tidx" -lt ${#t[@]} ]; do
  T=${t[$tidx]}
  echo "T:  ${T}"
  fidx=0
  while [ "$fidx" -lt ${#f[@]} ]; do
    F=${f[$fidx]}
    echo " F:  ${F}"
    sidx=0
    while [ "$sidx" -lt ${#s[@]} ]; do
      S=${s[$sidx]}
      echo "  S:  ${S}"
      U="${URL}${F}";
      /usr/bin/time ./ad "$U" "$T" "$S" > "${OD}/${F}_${T}_${S}.out" 2>"${OD}/${F}_${T}_${S}.time"
      #echo "${OD}/${f}_${T}_${S}.time"
      sidx=$((sidx+1))
    done # s
    fidx=$((fidx+1))
  done # f
  tidx=$((tidx+1))
done # t

📁 检测到 pp 变量名: 'pp' 📁 检测到 zmeso 变量名: 'lev_bnds' 🔍 调试信息开始 ================================================== ✅ aligned_pp 名称: pp ✅ aligned_zmeso 名称: lev_bnds 📊 aligned_pp 维度形状: {'time': 648, 'lev': 15, 'lat': 1, 'lon': 1} 📊 aligned_zmeso 维度形状: {'time': 648, 'lev': 50, 'bnds': 2, 'lat': 1, 'lon': 1} 🔧 aligned_pp 所有维度: ['time', 'lev', 'lat', 'lon'] 🔧 aligned_zmeso 所有维度: ['time', 'lev', 'bnds', 'lat', 'lon'] ⚠️ 共同维度 'lev': 长度分别为 15 和 50 ❌ 不匹配!无法直接广播 'lev' 维度 ⚠️ 共同维度 'lat': 长度分别为 1 和 1 ✅ 匹配 ⚠️ 共同维度 'time': 长度分别为 648 和 648 ✅ 匹配 ⚠️ 共同维度 'lon': 长度分别为 1 和 1 ✅ 匹配 🔄 尝试修复并计算乘积... 💡 zmeso 的 month_str 维度正常,无需 squeeze ❌ 运算失败: Cannot apply_along_axis when any iteration dimensions are 0 Traceback (most recent call last): File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\DC-run\8.27程序包\耦合运算.py", line 77, in <module> product = aligned_pp * zmeso_fixed * 2592000 # 单位转换因子 File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\_typed_ops.py", line 552, in __mul__ return self._binary_op(other, operator.mul) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\dataarray.py", line 4845, in _binary_op f(self.variable, other_variable_or_arraylike) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\_typed_ops.py", line 935, in __mul__ return self._binary_op(other, operator.mul) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\variable.py", line 2358, in _binary_op self_data, other_data, dims = _broadcast_compat_data(self, other) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\variable.py", line 2961, in _broadcast_compat_data if all(hasattr(other, attr) for attr in ["dims", "data", "shape", "encoding"]): File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\variable.py", line 2961, in <genexpr> if all(hasattr(other, attr) for attr in ["dims", "data", "shape", "encoding"]): File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\variable.py", line 436, in data duck_array = self._data.get_duck_array() File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 843, in get_duck_array self._ensure_cached() File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 840, in _ensure_cached self.array = as_indexable(self.array.get_duck_array()) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 797, in get_duck_array return self.array.get_duck_array() File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 652, in get_duck_array array = self.array[self.key] File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\backends\netCDF4_.py", line 108, in __getitem__ return indexing.explicit_indexing_adapter( File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\core\indexing.py", line 1021, in explicit_indexing_adapter result = raw_indexing_method(raw_key.tuple) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\xarray\backends\netCDF4_.py", line 121, in _getitem array = getitem(original_array, key) File "src\\netCDF4\\_netCDF4.pyx", line 5055, in netCDF4._netCDF4.Variable.__getitem__ File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\netCDF4\utils.py", line 429, in _StartCountStride start[...,i] = np.apply_along_axis(lambda x: e*x, i, np.ones(sdim[:-1])) File "C:\Users\ASUS\AppData\Local\Programs\Python\Python313\Lib\site-packages\numpy\lib\_shape_base_impl.py", line 390, in apply_along_axis raise ValueError( ValueError: Cannot apply_along_axis when any iteration dimensions are 0
09-19
你遇到的错误非常关键,说明你的两个变量 `pp` 和 `lev_bnds` **不仅维度不匹配(尤其是 `lev` 维度:15 vs 50)**,而且更严重的是:你加载了错误的变量! --- ## 🔍 关键问题分析 从你的输出可以看出: ```text 📁 检测到 pp 变量名: 'pp' 📁 检测到 zmeso 变量名: 'lev_bnds' ❌ 错误!这不是数据变量 ``` - ✅ `pp`: 是你要的数据(shape: `(time=648, lev=15, lat=1, lon=1)`) - ❌ `lev_bnds`: 是一个**坐标边界变量**(bounds),不是物理量!它的 shape 是 `(time=648, lev=50, bnds=2, ...)`,它表示 `lev` 坐标的上下界(比如 pressure level bounds),**不能参与物理计算!** --- ### 🚫 所以你现在的问题是: 你在用 `pp`(大气变量)乘以 `lev_bnds`(层边界坐标),这在科学上毫无意义,并且因为 `lev` 维度长度不同(15 vs 50),xarray 根本无法广播。 此外,报错中出现的: ``` ValueError: Cannot apply_along_axis when any iteration dimensions are 0 ``` 通常是 NetCDF 后端读取时索引越界或维度完全不兼容导致的——根本原因就是:**你在操作一个根本不该被当作“场变量”的 `lev_bnds`。** --- ## ✅ 正确做法:你应该找的是 `zmeso` 这个变量! 你原本想加载的是 `zmeso`(可能是垂直扩散系数等),但它没有出现在 `data_vars` 中,可能是因为: - 它被命名成了别的名字(如 `z_meso`, `zm`, `eddy_diffusivity` 等) - 或者它是作为 `coordinate variable` 存在 - 或者文件结构异常 --- ## ✅ 解决方案:完整调试 + 正确提取变量 以下是修复后的代码,重点包括: 1. 打印所有变量(包括 coordinates) 2. 判断哪个才是真正的 `zmeso` 数据 3. 检查维度是否可对齐(特别是 `lev` 层需要一致) 4. 如果 `lev` 不同,进行插值对齐 --- ### ✅ 修正版完整代码 ```python import xarray as xr import numpy as np # ============================= # 第一步:加载 Dataset # ============================= ds_pp = xr.open_dataset(r'E:\Except-Desktop\DC\CMIP6-download\historical-pp\pp_c2_restored.nc') ds_zmeso = xr.open_dataset(r'E:\Except-Desktop\DC\CMIP6-download\historical-zmeso\zmeso_c2_restored.nc') print("📄 ds_pp 内容:") print("🔹 数据变量 (data_vars):", list(ds_pp.data_vars)) print("🔹 坐标变量 (coords):", list(ds_pp.coords)) print() print("📄 ds_zmeso 内容:") print("🔹 数据变量 (data_vars):", list(ds_zmeso.data_vars)) print("🔹 坐标变量 (coords):", list(ds_zmeso.coords)) print() # ============================= # 第二步:手动选择正确的变量 # ============================= # --- 提取 pp --- if "pp" in ds_pp.data_vars: aligned_pp = ds_pp["pp"] else: # 如果不是 pp,尝试第一个非坐标的变量 var_pp = list(ds_pp.data_vars)[0] aligned_pp = ds_pp[var_pp] print(f"⚠️ 注意:使用备用变量 '{var_pp}' 作为 pp") # --- 提取 zmeso(排除 lev_bnds 这种坐标边界)--- possible_zmeso_names = ['zmeso', 'zm', 'z_meso', 'eddy_diffusivity', 'diffusion_coefficient'] found = False for name in possible_zmeso_names: if name in ds_zmeso.data_vars: aligned_zmeso = ds_zmeso[name] print(f"✅ 找到 zmeso 变量: '{name}'") found = True break if not found: # 备选:尝试非边界类变量 candidates = [v for v in ds_zmeso.data_vars if "bnds" not in v and "bounds" not in v] if len(candidates) > 0: name = candidates[0] aligned_zmeso = ds_zmeso[name] print(f"⚠️ 使用候选变量 '{name}' 作为 zmeso(未找到标准名称)") else: raise ValueError("❌ 在 zmeso 文件中找不到任何可用的数据变量!") print(f"✅ aligned_pp 变量名: {aligned_pp.name}, shape: {aligned_pp.shape}") print(f"✅ aligned_zmeso 变量名: {aligned_zmeso.name}, shape: {aligned_zmeso.shape}") # ============================= # 第三步:检查维度并尝试对齐 # ============================= print("\n🔍 维度检查:") print(f"aligned_pp.dims : {dict(aligned_pp.dims)}") print(f"aligned_zmeso.dims: {dict(aligned_zmeso.dims)}") # 必须对齐的维度:time, lat, lon, lev common_dims = set(aligned_pp.dims) & set(aligned_zmeso.dims) for dim in common_dims: len1 = len(aligned_pp[dim]) len2 = len(aligned_zmeso[dim]) print(f"⚠️ 共同维度 '{dim}': {len1} vs {len2}") if len1 != len2: if dim == "lev": print(f"💡 需要沿 'lev' 维度插值对齐") # 使用 interp 方法将 zmeso 插值到 pp 的 lev 上 try: aligned_zmeso = aligned_zmeso.interp(lev=aligned_pp.lev, kwargs={"fill_value": "extrapolate"}) print(f"✅ 已将 zmeso 插值到 lev={len(aligned_pp.lev)} 层") except Exception as e: print(f"❌ 插值失败: {e}") raise else: raise ValueError(f"维度 '{dim}' 长度不匹配且无法处理: {len1} ≠ {len2}") # 对于非共同维度(如 bnds),去掉(如果只用于 bounds) if 'bnds' in aligned_zmeso.dims: print("🗑️ 移除无关维度 'bnds'") aligned_zmeso = aligned_zmeso.isel(bnds=0) # 取第一个边界,或根据需求调整 # ============================= # 第四步:执行乘法运算 # ============================= try: print("\n🔄 开始计算乘积...") product = aligned_pp * aligned_zmeso * 2592000 print("🎉 成功完成乘法运算!结果形状:", dict(product.sizes)) except Exception as e: print("❌ 运算失败:", str(e)) raise # ============================= # 第五步:保存结果 # ============================= output_ds = product.to_dataset(name="pp_times_zmeso") save_path = r'E:\Except-Desktop\DC\CMIP6-download\results\pp_zmeso_aligned.nc' output_ds.to_netcdf(save_path) print(f"💾 结果已保存到: {save_path}") print("=" * 50) print("✅ 耦合运算完成") ``` --- ## 🧠 总结与建议 | 问题 | 解决方案 | |------|----------| | `lev_bnds` 不是数据 | 不要用 `list(...)[0]` 自动取变量,要按名查找 | | `lev` 维度不一致(15 vs 50) | 使用 `.interp(lev=...)` 插值对齐 | | 报错 `apply_along_axis` | 通常是维度不兼容 + NetCDF 读取异常,根源是数据选取错误 | | 不知道变量名? | 打印 `ds.data_vars` 和 `ds.coords` 查看结构 | --- ## 🔬 如何查看 NetCDF 文件结构? 你可以用命令行工具或 Python 快速查看: ```bash # 安装后使用 ncdump -h your_file.nc ``` 或者 Python: ```python from netCDF4 import Dataset with Dataset("your_file.nc") as nc: print(nc.variables.keys()) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值