亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在不循環的情況下比較兩個數據幀之間的每個數據點之間的每個數據點

在不循環的情況下比較兩個數據幀之間的每個數據點之間的每個數據點

慕斯709654 2022-01-11 16:04:24
我想檢查來自 dataframe-1 (df1) 的坐標 (x,y,z),以查看該位置是否足夠接近具有存儲在 dataframe-2 中的自己的坐標 (x,y,z) 的不規則表面(df2)。我能夠遍歷 df1 中的每個坐標,然后遍歷 df2 中的所有坐標并檢查它的距離。然后對 df1 中的所有坐標重復,但是當我在 df1 中有超過 1,000,000 個坐標要檢查時,這將花費很長時間。我正在使用熊貓,想知道是否可以在不循環的情況下完成。如果 df1 中的坐標接近 df2,那么我想選擇它并將其存儲到 df3 中。
查看完整描述

2 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

Scipy 可以幫助你。請看以下假設示例:


import pandas as pd 

from scipy.spatial import cKDTree


dataset1 = pd.DataFrame(pd.np.random.rand(100,3))

dataset2 = pd.DataFrame(pd.np.random.rand(10, 3))


ck = cKDTree(dataset1.values)


ck.query_ball_point(dataset2.values, r=0.1)

數組([列表([]),列表([]),列表([]),列表([]),列表([28, 83]),列表([79]),列表([]),列表([86]), 列表([40]), 列表([29, 60, 95])], dtype=object)


查看完整回答
反對 回復 2022-01-11
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

使用 Numpy 方法:


如果您的兩個數據框如下所示:


df1

    coords

0   (4,3,5)

1   (5,4,3)


df2

    coords

0   (6,7,8)

1   (8,7,6)

然后:


import numpy as np

from itertools import product


#convert dataframes into numpy arrays

df1_arr = np.array([np.array(x) for x in df1.coords.values])

df2_arr = np.array([np.array(x) for x in df2.coords.values])


#create array of cartesian product of elements of the two arrays

cart_arr = np.array([x for x in product(df1_arr,df2_arr)])


#compute Euclidian distance (or norm) between pairs of elements in two arrays

#outputs new array with one value per pair of coordinates

norms_arr = np.linalg.norm(np.diff(cart_arr,axis=1)[:,0,:],axis=1)


#create distance threshold for "close enough"

radius = 5.5


#find values in norms array that are less than or equal to distance threshold

good_idxs = np.argwhere(norms_arr <= radius)[:,0]

good_coord_pairs = cart_arr[good_idxs]


#store corresponding pairs of coordinates and distances in new dataframe

final_df = pd.DataFrame({'df1_coords':list(map(tuple,good_coord_pairs[:,0,:])),

   'df2_coords':list(map(tuple(good_coord_pairs[:,1,:])), 'distance':norms_arr[good_idxs],

   index=list(range(len(good_coord_pairs))))

將產生:


final_df

    df1_coords  df2_coords  distance

0   (4,3,5)     (6,7,8)     5.385165

1   (5,4,3)     (8,7,6)     5.196152


查看完整回答
反對 回復 2022-01-11
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號