我希望删除我的数组中在第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]]
提前感谢您提供给难以接受的初学者的任何帮助!
答案 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',例如。