如何一次计算指定坐标和2d xarray数据之间的欧几里德距离

2024-05-10 19:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如何一次计算指定坐标和二维X射线数据之间的欧几里德距离(无for循环)

我编写了以下代码。但是,如果数据大小变大,该脚本的速度就会变慢。没有for循环,我如何做同样的事情

import math
import xarray as xr 
import numpy as np

#set the specified lat, lon
specific_lat = 15
specific_lon = 65

#create sample xarry data
lat = [0, 10, 20]
lon = [50, 60, 70, 80]

#sample data
test_data = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])

#to xarray
data_xarray = xr.DataArray(test_data, dims=("lat","lon"), coords={"lat":lat, "lon":lon})

#calculate distance
xarray_distance = data_xarray #copy
xarray_distance.data[:,:] = 0.0 #zero-reset

for lat in data_xarray.lat.data:
    for lon in data_xarray.lon.data:
        xarray_distance.loc[{"lat":lat,"lon":lon}] = math.sqrt((lat- spec_lat)**2 + (lon - spec_lon)**2)

print(xarray_distance)

#<xarray.DataArray (lat: 3, lon: 4)>
#array([[21, 15, 15, 21],
#       [15,  7,  7, 15],
#       [15,  7,  7, 15]])
#Coordinates:
#  * lat      (lat) int64 0 10 20
#  * lon      (lon) int64 50 60 70 80


Tags: 数据sampletestimportfordataasnp
1条回答
网友
1楼 · 发布于 2024-05-10 19:04:18

首先,xarray_distance = data_xarray不复制对象。两个名称将看到相同的对象以及对其进行的任何更改。对于副本,您需要执行data_xarray.copy()

现在,您不需要使用循环,而是希望利用numpy的矢量化和广播功能一次性创建2D阵列,并将其设置为xarray的对象数据

lat = np.array(lat)
lon = np.array(lon)
xarray_distance.data = np.sqrt((lat - spec_lat)[:,None]**2 + ((lon - spec_lon)**2))

结果

<xarray.DataArray (lat: 3, lon: 4)>
array([[21.21320344, 15.8113883 , 15.8113883 , 21.21320344],
       [15.8113883 ,  7.07106781,  7.07106781, 15.8113883 ],
       [15.8113883 ,  7.07106781,  7.07106781, 15.8113883 ]])
Coordinates:
  * lat      (lat) int32 0 10 20
  * lon      (lon) int32 50 60 70 80

您会注意到数据是浮动的,考虑到它们所代表的内容,它们可能应该是浮动的。如果您希望将它们保存在原始数据类型中,请替换为

xarray_distance.data = np.sqrt(...)

xarray_distance.data = np.sqrt(...).astype(xarray_distance.data.dtype)

相关问题 更多 >