Python - 从数组中删除元素

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,从07.

我在Python中尝试做的是删除"重复",我的意思是删除所有b具有相似值的索引a.例如,请注意有对1.31.7.另外,还有一些18.418.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方式来实现它?

Div*_*kar 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
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上一步骤中最后一步所需的掩码.