0 python arrays numpy matplotlib scipy
我有一个叫做数组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]
Run Code Online (Sandbox Code Playgroud)
在这个例子中b包含的指标a,从0到7.
我在Python中尝试做的是删除"重复",我的意思是删除所有b具有相似值的索引a.例如,请注意有对1.3和1.7.另外,还有一些18.4和18.1等,我想找到所有这些值,并写-1在阵列中的所有地方b,其具有的价值.
输出应如下:
b = [0, -1, 2, 3, 4, -1, -1, -1]
Run Code Online (Sandbox Code Playgroud)
我认为很明显我想要实现的目标.这里索引1被替换为-1因为a它代表1.7哪个具有"对" 1.3.此外,最后3个索引代表18.1,81.9并且56.9之前也有它们的"对",因此它们被替换为-1.
当然,我有一个x表示"相似"值的参数.所以,这里的x = 2意思是任何相差2的值2都是相似的.
我试过了什么?我尝试使用2个嵌套for循环和许多不必要的变量,我的算法会占用内存和性能.是否有一种优雅的np方式来实现它?
方法#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
Run Code Online (Sandbox Code Playgroud)
样品运行 -
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])
Run Code Online (Sandbox Code Playgroud)
方法#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
Run Code Online (Sandbox Code Playgroud)
使用此掩码替换mask上一步骤中最后一步所需的掩码.