我正在用Python进行一项相关研究,该研究需要具有60,000个数据点的数据集中每对坐标之间的距离矩阵.我try 过进行垂直化并使用Objandas,但Objandas的问题在于,要运行距离函数,我需要重复列表中的x和y数据(x数据重复60,000个塔的集合,y连续重复每个坐标60,000次)使每个列表3.6e9值长,并且我的计算机在此完成之前内存耗尽,或者当我try 在学校的远程桌面上运行它时,需要半个多小时,但我一直无法成功运行它.这是我正在运行的代码:

#Florida Tower Matrix 
#take coordinates of Florida towers
#CHECK THE LAT/LONG order 
import geojson
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
features = []
with open("/Users/katcn/Desktop/Spring 2024/Research/PleaseWork.geojson") as f:
   gj = geojson.load(f)

for i in range(59629):
   features.append(gj['features'][i]["geometry"]['coordinates'])


#OR make the X matrix all in one column 
#make the Y matrix repeat each value 59000 times 
longitude = []
latitude = []
for i in range(len(features)):
   for j in range(len(features)):
       longitude.append(features[j][0])
   for k in range(len(features)):
       latitude.append(features[i][0])


dict = {"longitude" : longitude, "latitude" : latitude}
df = pd.DataFrame(dict)
dict2 = {"longitude" : longitude, "latitude" : latitude}
df2 = pd.DataFrame(dict2)
#calculate distance between two towers 
geometry = [Point(xy) for xy in zip(df.longitude, df.latitude)]
gdf = gpd.GeoDataFrame(df, crs={'init': 'epsg:4326'}, geometry=geometry)

geometry2 = [Point(xy) for xy in zip(df2.longitude, df2.latitude)]
gdf2 = gpd.GeoDataFrame(df2, crs={'init': 'epsg:4326'}, geometry=geometry2)

distances = gdf.geometry.distance(gdf2.geometry)

print(distances)

任何关于如何以不同的方式处理这个问题以使其成为更合理的运行时的建议都是很棒的.

推荐答案

这个答案是为了解决紧接着的问题,即将您获得的结果保存到CSV文件.考虑到数据的剪切大小,pd.to_csv()不是一个好方法.

在这里,我通过计算距离矩阵来建立之前的解决方案,请注意,该矩阵实际上是稀疏的,因为xy之间的距离与yx之间的距离相同(因此该矩阵是三角形的.

我通过添加点(latlong)来创建 pyramid .然后,使用polar,我将Pandas pandamrame转换为极地pandamrame,并最终保存它:

import numpy as np
import pandas as pd
import time

def haversine(lat1, lon1, lat2, lon2):
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
    c = 2 * np.arcsin(np.sqrt(a)) 
    r = 6371  
    return c * r

np.random.seed(42)
latitudes = np.random.uniform(low=25.0, high=49.0, size=10000)
longitudes = np.random.uniform(low=-125.0, high=-66.0, size=10000)
coords = np.column_stack((latitudes, longitudes))

start_time = time.time()

n = coords.shape[0]
dist_matrix = np.zeros((n, n))
for i in range(n):
    dist_matrix[i, :] = haversine(coords[i, 0], coords[i, 1], coords[:, 0], coords[:, 1])

end_time = time.time()
elapsed_time = end_time - start_time
print("Distance matrix computed in {:.2f} seconds".format(elapsed_time))
print("Shape of the distance matrix:", dist_matrix.shape)

point_labels = [f"Point {i}" for i in range(n)]
dist_df = pd.DataFrame(dist_matrix, index=point_labels, columns=point_labels)


distance = dist_df.loc['Point 0', 'Point 1']
print(f"Distance from Point 0 to Point 1: {distance} km")

lat_lon_index = pd.MultiIndex.from_arrays([latitudes, longitudes], names=['Latitude', 'Longitude'])
dist_df.index = lat_lon_index
dist_df.columns = lat_lon_index

lat_from, lon_from = latitudes[0], longitudes[0]  
lat_to, lon_to = latitudes[1], longitudes[1]
distance = dist_df.loc[(lat_from, lon_from), (lat_to, lon_to)]
print(f"Distance from ({lat_from}, {lon_from}) to ({lat_to}, {lon_to}): {distance} km")

现在dist_df看起来是这样的

enter image description here

要将其保存到CSV,只需执行以下操作:

dist_df_reset = dist_df.reset_index()

polars_df = pl.from_pandas(dist_df_reset)

polars_df.write_csv('polars_distance_matrix.csv')

该文件将是:

enter image description here

重要注意事项:这会快得多,但您不能希望它花很少的时间来处理这么多积分

Python相关问答推荐

Odoo -无法比较使用@api.depends设置计算字段的日期

如何通过多2多字段过滤查询集

Python中使用时区感知日期时间对象进行时间算术的Incredit

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

未删除映射表的行

如何从具有不同len的列表字典中创建摘要表?

按列分区,按另一列排序

log 1 p numpy的意外行为

Python解析整数格式说明符的规则?

为一个组的每个子组绘制,

实现神经网络代码时的TypeError

将scipy. sparse矩阵直接保存为常规txt文件

try 检索blob名称列表时出现错误填充错误""

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

如何在Python Pandas中填充外部连接后的列中填充DDL值

在Python中控制列表中的数据步长

如何用FFT确定频变幅值

递归链表反转与打印语句挂起