Python - 从数组中删除元素

时间:2017-04-17 17:58:02

标签: 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]

在此示例中,b包含从a0的{​​{1}}索引。

我在Python中尝试删除"重复",我的意思是删除7b中具有相似值的所有索引。例如,请注意有a1.3对。此外,还有1.718.4等。我想找到所有这些值,并在数组18.1中具有该值的所有位置写-1

输出应如下:

b

我认为我想要实现的目标显而易见。此处索引b = [0, -1, 2, 3, 4, -1, -1, -1] 已替换为1,因为在-1中,它代表a,其中"对" 1.7。此外,最后3个索引代表1.318.181.9,它们也有#34;对#34;之前,所以它们被替换为56.9

当然,我有一个参数-1,它代表"类似的"价值观是。所以,这里x表示任何由x = 2相差的2个值都相似。

我尝试了什么?我尝试使用2个嵌套for循环和许多不必要的变量,我的算法会占用内存和性能。是否有一种优雅的2 - ish方式来实现它?

1 个答案:

答案 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