根据numpy数组中一行中的重复值删除列

时间:2016-07-27 08:22:55

标签: python arrays numpy

我希望删除我的数组中在第1行中有重复条目的列,如下所示(第1行重复值为1和2.5,因此每个值中的一个已被删除,每列被删除的值都在其中。

initial_array =

row 0   [[  1,    1,    1,    1,    1,    1,    1,    1,]
row 1    [0.5,    1,  2.5,    4,  2.5,    2,    1,  3.5,]
row 2    [  1,  1.5,    3,  4.5,    3,  2.5,  1.5,    4,]
row 3    [228,  314,  173,  452,  168,  351,  300,  396]]

final_array =
row 0   [[  1,    1,    1,    1,    1,    1,]
row 1    [0.5,    1,  2.5,    4,    2,  3.5,]
row 2    [  1,  1.5,    3,  4.5,  2.5,    4,]
row 3    [228,  314,  173,  452,  351,  396]]

我想的方法包括使用一些检查重复的函数,在数据集中出现值的第二(或更多)时间给出True响应,然后使用该响应删除行。那个或者可能在numpy.unique中使用return indices函数。我无法通过它找到方法或找到合适的功能。

如果我能找到一种方法来返回保留重复和删除重复行3中的平均值,那就更好了(见下文)。

final_array_averaged =
row 0   [[  1,    1,      1,    1,    1,    1,]
row 1    [0.5,    1,    2.5,    4,    2,  3.5,]
row 2    [  1,  1.5,      3,  4.5,  2.5,    4,]
row 3    [228,  307,  170.5,  452,  351,  396]]

提前感谢您提供给难以接受的初学者的任何帮助!

3 个答案:

答案 0 :(得分:2)

您可以使用np.unique附带的可选参数,然后使用np.bincount将最后一行用作权重以获得最终的平均输出,如下所示 -

_,unqID,tag,C = np.unique(arr[1],return_index=1,return_inverse=1,return_counts=1)
out = arr[:,unqID]
out[-1] = np.bincount(tag,arr[3])/C

示例运行 -

In [212]: arr
Out[212]: 
array([[   1. ,    1. ,    1. ,    1. ,    1. ,    1. ,    1. ,    1. ],
       [   0.5,    1. ,    2.5,    4. ,    2.5,    2. ,    1. ,    3.5],
       [   1. ,    1.5,    3. ,    4.5,    3. ,    2.5,    1.5,    4. ],
       [ 228. ,  314. ,  173. ,  452. ,  168. ,  351. ,  300. ,  396. ]])

In [213]: out
Out[213]: 
array([[   1. ,    1. ,    1. ,    1. ,    1. ,    1. ],
       [   0.5,    1. ,    2. ,    2.5,    3.5,    4. ],
       [   1. ,    1.5,    2.5,    3. ,    4. ,    4.5],
       [ 228. ,  307. ,  351. ,  170.5,  396. ,  452. ]])

可以看出,输出现在有一个订单,第二行正在排序。如果您希望按原样保留订单,请使用np.argsort的{​​{1}},如此 -

unqID

答案 1 :(得分:1)

您可以使用select @i = count(@stringOfGuids) 找到所需列的索引:

unique

然后使用简单的索引来获取所需的列:

>>> indices = np.sort(np.unique(A[1], return_index=True)[1])

答案 2 :(得分:0)

这是一个典型的分组问题,使用numpy_indexed包可以优雅高效地解决(免责声明:我是作者):

import numpy_indexed as npi
unique, final_array = npi.group_by(initial_array[1]).mean(initial_array, axis=1)

请注意,除了平均值之外还有许多其他减少量;如果你想要你描述的原始行为,你可以用'first'替换'mean',例如。