2016-07-27 123 views
3

我希望删除我的数组中有第1行重复条目的列,如下所示(第1行重复值为1 & 2.5,因此每个列中的一个那些值已经被删除,连同列中每个删除的值都在其中)。基于numpy数组中的一行中的重复值删除列

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]] 

的方法,我想使用的重复检查的一些功能,从而为第二(或更多)时间的值在数据集中打开了一个真实反应包括,然后使用该响应删除行的。这或者可能使用numpy.unique中的返回索引函数。我只是无法找到通过它的方法或找到正确的功能。

如果我能找到一种方法来返回保留重复的第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]] 

在此先感谢您给予初学者难倒的任何帮助!

回答

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. ]]) 

可以看出,输出具有正与第二行进行排序的顺序。如果您正在寻找保持秩序,因为它本来,使用unqIDnp.argsort,像这样 -

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

这是完美的,非常感谢你! – georussell

1

可以使用unique找到所需列的索引:

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

然后用一个简单的索引来获取欲望列:

>>> A[:,indices] 
array([[ 1. , 1. , 1. , 1. , 1. , 1. ], 
     [ 0.5, 1. , 2.5, 4. , 2. , 3.5], 
     [ 1. , 1.5, 3. , 4.5, 2.5, 4. ], 
     [ 228. , 314. , 173. , 452. , 351. , 396. ]]) 
+0

这正是我发布一分钟前的答案!但为什么使用np.sort? –

+0

@ColonelBeauvel不,不是,你的答案不能保持顺序。 ;-)虽然我没有看到你的答案。 – Kasramvd

+0

这是完全正确的,订单有问题。 –

0

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

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

请注意,还有许多其他比平均值减少;如果你想要描述你原来的行为,你可以用'first'代替'mean'。

相关问题