如何将Excel中的纬度、经度、深度数据转换为Python的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

