如何用两个numpy一维数组生成含重复元素的二维数组
Numpy数组转换问题求助
我是Python新手,现在遇到numpy数组处理的问题,希望得到帮助。我有两个一维numpy数组:
Lon_gp = np.arange(10,20,0.25 ).reshape(-1,1) Lat_gp = np.arange(40,50,0.25 ).reshape(-1,1)
我想把这两个数组转换成如下形式的二维数组:
| Lon_list | Lat_list |
|---|---|
| 10 | 40 |
| 10 | 40.25 |
| 10 | 40.5 |
| 10 | 40.75 |
| ... | ... |
| 10 | 49.25 |
| 10.25 | 40 |
| 10.25 | 40.25 |
| 10.25 | 40.50 |
| 10.25 | 40.75 |
目前我只写了几行代码:
n_lon = len(Lon_gp) n_lat = len(Lat_gp) lon_list = np.empty(n_lon * n_lat) for i in Lon_gp: a = np.repeat(i, n_lat)
解决方案
你要的是两个数组的笛卡尔积,用numpy内置函数可以高效实现,完全不需要手动循环:
方法1:用np.repeat + np.tile组合
import numpy as np Lon_gp = np.arange(10,20,0.25).reshape(-1,1) Lat_gp = np.arange(40,50,0.25).reshape(-1,1) n_lon = len(Lon_gp) n_lat = len(Lat_gp) # 每个经度值重复n_lat次,生成经度列 lon_col = np.repeat(Lon_gp, n_lat, axis=0) # 整个纬度数组重复n_lon次,生成纬度列 lat_col = np.tile(Lat_gp, (n_lon, 1)) # 合并为目标二维数组 result = np.hstack((lon_col, lat_col))
方法2:用np.meshgrid
import numpy as np Lon_gp = np.arange(10,20,0.25) Lat_gp = np.arange(40,50,0.25) # 生成网格,indexing='ij'保证经度先遍历所有纬度,和目标格式一致 lon_grid, lat_grid = np.meshgrid(Lon_gp, Lat_gp, indexing='ij') # 展平后合并为二维数组 result = np.hstack((lon_grid.flatten().reshape(-1,1), lat_grid.flatten().reshape(-1,1)))
补充:你的代码如何完善
如果坚持用循环,需要把每次生成的重复数组拼接起来,否则只会保留最后一次循环的结果:
n_lon = len(Lon_gp) n_lat = len(Lat_gp) lon_list = np.empty((n_lon * n_lat, 1)) lat_list = np.empty((n_lon * n_lat, 1)) for idx, lon in enumerate(Lon_gp): start = idx * n_lat end = start + n_lat lon_list[start:end] = np.repeat(lon, n_lat) lat_list[start:end] = Lat_gp result = np.hstack((lon_list, lat_list))
注意:循环方法效率远低于numpy内置函数,数据量大时不推荐使用。
内容的提问来源于stack exchange,提问作者Tee
相关产品推荐
相关产品推荐

