我想制作一个matplotlib等高线图。为此,我需要定义一个向量Lat,Lon和Den。 Lat和Lon有128个唯一值,占16384个可能的对。我已经有一个矩阵,其中包含Lat,Lon和Den的列。但是,这个矩阵的大小是10946.这意味着有一对Lat-Lon没有与之关联的Den,并且我想取0的值。例如:< / p>
Matrix = array([[ 1.5, 0.9, 1.5],
[ 1.5, 1.5, 1 ],
[ 2.9, 1.5, 2 ]])
第一列是Lat,第二列是Lon,第三列是密度。我可以使用:
创建一个meshgrid Lat, Lon = np.mesgrid(set(Matrix[:,0]), set(Matrix[:,1]))
这将返回6种组合。如何使数组“Den”使得我的原始矩阵中的值为一对Lat-Lon,否则为0?如果可以避免循环,那就更好了。
答案 0 :(得分:1)
您在点(lat=30, long=20)
附近有一个这样的表格,例如:
# tab= array([
# [ 30.1310486 , 20.86128027, 0.34034154],
# [ 30.44384707, 20.84228301, 0.14557502],
# [ 30.7601326 , 20.9971842 , 0.16993092],
# ...,
# [ 30.3797119 , 20.47931737, 0.08614626],
# [ 30.37689017, 20.8116245 , 0.60779073],
# [ 30.33829254, 20.02353876, 0.31654195]])
# shape (10946, 3)
您可以使用np.unique
代替set
,它提供了有用的反向索引,用整数标记纬度和经度:
lat,long,den = tab.T
uniq_lat,inv_lat = np.unique(lat,return_inverse=True)
uniq_long,inv_long = np.unique(long,return_inverse=True)
然后构建一个完整的密度网格:
dims = uniq_lat.size,uniq_long.size
new_den=np.zeros(dims) # unknown values
new_den[inv_lat,inv_long]=den # known values
重建一个(已排序的)完整表:
new_lat,new_long=meshgrid(uniq_lat,uniq_long)
new_tab=np.concatenate((new_lat,new_long,new_den)).reshape(3,-1).T