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

如何将Excel中的纬度、经度、深度数据转换为Python的3D数组?

问题:Excel转3D数组用于海上导航强化学习

我在将Excel文件中的数据转换为3D数组时遇到问题。数据包含挪威西部某海域的纬度、经度和深度信息,后续计划用强化学习算法基于该3D数组地图实现海上区域导航(识别深度为正的区域),目前处于自动航线规划的第一步。

当前代码生成了3个独立数组,每个数组行数和Excel元素数一致:

import pandas as pd
import numpy as np

file_loc = "excel1.xlsx"
Lat = pd.read_excel(file_loc,sheet_name='Sheet2', index_col=None, na_values=['NA'], usecols="A")
long = pd.read_excel(file_loc,sheet_name='Sheet2', index_col=None, na_values=['NA'], usecols="B")
Depth = pd.read_excel(file_loc,sheet_name='Sheet2', index_col=None, na_values=['NA'], usecols="C")

treD_array = np.array([[[Lat], [long]], [Depth]])

print(treD_array)

运行后得到如下输出及警告:

VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
treD_array = np.array([[[Lat], [long]], [Depth]])
[list([[ 60.262092
0 60.262092
1 60.262092
2 60.262092
3 60.262092
4 60.262092
... ...
23973 60.444314
23974 60.444314
23975 60.444314
23976 60.444314
23977 60.444314

[23978 rows x 1 columns]], [ 5.12317
0 5.123893
1 5.124616
2 5.125339
3 5.126063
4 5.126786
... ...
23973 5.277191
23974 5.277915
23975 5.278638
23976 5.279361
23977 5.280084

[23978 rows x 1 columns]]]) list([ 27.47
0 42.26
1 60.70
2 81.17
3 100.91
4 118.34
... ...
23973 187.83
23974 155.94
23975 104.80
23976 74.50
23977 54.84

[23978 rows x 1 columns]])]

我完全不理解这个警告信息,希望得到帮助。


解决方案

警告原因解释

这个警告是因为你试图把形状不匹配的嵌套序列转换成NumPy数组:

  • 你读取的Lat、long、Depth都是1列的DataFrame,本身就是二维结构((23978,1))
  • 你嵌套的方式[[[Lat], [long]], [Depth]]导致序列结构混乱,NumPy无法生成规整的多维数组,只能退化成object类型的数组,这就是所谓的“ragged nested sequences(不规则嵌套序列)”

修正代码

首先明确:用于导航的3D数组通常有两种结构,根据你的采样数据类型选择:

方案1:生成N×3的二维数组(离散采样点)

如果你的数据是离散的海域采样点,每个点对应一组(纬度,经度,深度),可以直接整合三列数据:

import pandas as pd
import numpy as np

file_loc = "excel1.xlsx"
# 一次性读取三列,避免重复读文件
df = pd.read_excel(file_loc, sheet_name='Sheet2', index_col=None, na_values=['NA'], usecols="A:C")
# 转换成NumPy数组,形状为(23978, 3),每一行对应一个点的三维信息
point_array = df.to_numpy()
print(point_array.shape)  # 输出 (23978, 3)

方案2:生成规整的3D网格数组(经纬度网格)

如果你的数据是规则网格采样(相同纬度/经度间隔),可以整理成网格形式的3D数组:

import pandas as pd
import numpy as np

file_loc = "excel1.xlsx"
df = pd.read_excel(file_loc, sheet_name='Sheet2', usecols="A:C", names=['lat', 'lon', 'depth'])

# 获取唯一的经纬度值并排序,确定网格的维度
unique_lats = np.sort(df['lat'].unique())
unique_lons = np.sort(df['lon'].unique())

# 创建网格形状的深度矩阵
depth_grid = np.zeros((len(unique_lats), len(unique_lons)))
# 填充深度值
for i, lat in enumerate(unique_lats):
    for j, lon in enumerate(unique_lons):
        depth_val = df[(df['lat'] == lat) & (df['lon'] == lon)]['depth'].values[0]
        depth_grid[i][j] = depth_val

# 生成包含经纬度的3D网格数组,形状为(纬度数, 经度数, 3)
lat_grid, lon_grid = np.meshgrid(unique_lats, unique_lons, indexing='ij')
threeD_grid = np.stack([lat_grid, lon_grid, depth_grid], axis=-1)
print(threeD_grid.shape)  # 输出 (纬度数, 经度数, 3)

关键注意事项

  • 避免多次调用pd.read_excel,一次性读取所有列更高效
  • 原代码的嵌套方式逻辑错误,导致数组结构混乱,必须调整数据整合逻辑
  • 选择哪种数组结构取决于你的强化学习导航算法需求:离散点用N×3数组,网格地图用维度匹配的3D网格数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:50:32