我有一个名为a
的数组和另一个数组b
。数组a
是我存储浮点数据的主数组,b
是一个包含属于a
的索引的数组。
示例:
a = [1.3, 1.7, 18.4, 56.2, 82.2, 18.1, 81.9, 56.9, -274.45]
b = [0, 1, 2, 3, 4, 5, 6, 7]
在此示例中,b
包含从a
到0
的{{1}}索引。
我在Python中尝试删除"重复",我的意思是删除7
中b
中具有相似值的所有索引。例如,请注意有a
和1.3
对。此外,还有1.7
和18.4
等。我想找到所有这些值,并在数组18.1
中具有该值的所有位置写-1
。
输出应如下:
b
我认为我想要实现的目标显而易见。此处索引b = [0, -1, 2, 3, 4, -1, -1, -1]
已替换为1
,因为在-1
中,它代表a
,其中"对" 1.7
。此外,最后3个索引代表1.3
,18.1
和81.9
,它们也有#34;对#34;之前,所以它们被替换为56.9
。
当然,我有一个参数-1
,它代表"类似的"价值观是。所以,这里x
表示任何由x = 2
相差的2个值都相似。
我尝试了什么?我尝试使用2个嵌套for循环和许多不必要的变量,我的算法会占用内存和性能。是否有一种优雅的2
- ish方式来实现它?
答案 0 :(得分:5)
方法#1:以下是使用broadcasting
和内存密集型的矢量化方法 -
x = 2 # threshold that decides similarity
a_b = a[b]
mask = np.triu(np.abs(a_b[:,None]-a_b)<x,1).any(0)
b[mask[:len(b)]] = -1
示例运行 -
In [95]: a = np.array([1.3, 1.7, 18.4, 56.2, 82.2, 18.1, 81.9, 56.9, -274.45])
...: b = np.array([0, 1, 2, 3, 4, 5, 6, 7])
...:
# After code run ...
In [97]: b
Out[97]: array([ 0, -1, 2, 3, 4, -1, -1, -1])
方法#2:减少内存密集型方法
import pandas as pd
def set_mask(a,b,thresh):
a_b = a[b]
N = len(a_b)
sidx = a_b.argsort()
sorted_a_b = a_b[sidx]
mask0 = sorted_a_b[1:] - sorted_a_b[:-1] < thresh
id_arr = np.zeros(N, dtype=int)
id_arr[np.flatnonzero(~mask0)+1] = 1
ids = id_arr.cumsum()
d = np.column_stack(( ids, sidx))
df0 = pd.DataFrame(d, columns=(('ids','sidx')))
pp = df0['sidx'].groupby([ids]).min()
maskc = np.ones(N,dtype=bool)
maskc[pp.values] = 0
return maskc
使用此掩码替换上一步骤中最后一步所需的mask
。