給定一維array
a=np.array([ 65, 251, 431])
另一個 1Darray用于構建邊界。
b=np.array([ 4, 10, 18, 22, 28, 33, 40, 49, 72, 83, 90, 93, 99,
107, 113, 119, 130, 142, 161, 167, 173, 178, 183, 196, 202, 209,
215, 221, 228, 233, 240, 258, 262, 269, 274, 281, 286, 297, 311,
317, 352, 354, 358, 365, 371, 376, 382, 389, 396, 413, 420, 441,
443, 450, 459, 467, 473, 477, 483, 491, 495, 497])
例如,兩個點邊界可以是坐標4,10, 4,18, 4,497,..., 495,497。
目標是找到一個整數(例如,陣列 a 中的每個整數)可以駐留的最接近的邊界值對。
例如值65,它可以駐留的最近邊界是49,72。
下面的代碼應該回答目標
import numpy as np
import pandas as pd
a=np.array([ 65, 251, 431])
# Assumed `b` is sorted from lowest to highest value and no duplicate values
b=np.array([ 4, 10, 18, 22, 28, 33, 40, 49, 72, 83, 90, 93, 99,
107, 113, 119, 130, 142, 161, 167, 173, 178, 183, 196, 202, 209,
215, 221, 228, 233, 240, 258, 262, 269, 274, 281, 286, 297, 311,
317, 352, 354, 358, 365, 371, 376, 382, 389, 396, 413, 420, 441,
443, 450, 459, 467, 473, 477, 483, 491, 495, 497])
leadB =b[:-1]
trailB=b[1:]
all_val=[]
for dis_a in a:
for l,t in zip(leadB,trailB):
if l < dis_a <= t:
all_val.append({'a':dis_a,'lb':l,'tb':t})
# The final output can be in the form of pandas or numpy array
df=pd.DataFrame(all_val)
但是,上述方法在很大程度上依賴于兩個階段for-loop。Numpy我想知道是否有有效的方法可以使用or的內置功能來做到這一點Pandas。
uj5u.com熱心網友回復:
這似乎是使用的理想問題np.searchsorted,但是根據您的實際要求,可以有兩種可能的解決方案:
- 如果保證中的所有元素
a都落在邊界點之間:
i = np.searchsorted(b, a)
df = pd.DataFrame({'a': a, 'lb': b[i - 1], 'tb': b[i]})
- 如果 的某些元素
a不屬于邊界點,則更通用的解決方案是:
i = np.searchsorted(b, a)
m = ~np.isin(i, [0, len(b)])
df = pd.DataFrame({'a': a})
df.loc[m, 'lb'], df.loc[m, 'tb'] = b[i[m] - 1], b[i[m]]
結果
a lb tb
0 65 49 72
1 251 240 258
2 431 420 441
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468417.html
上一篇:如何從逐行計算中填充資料框?
下一篇:根據先前的分組構建新列
