我有一个 ND 数组(向量)列表,每个向量都有一个 (1,300)
形状。
我的目标是在列表中找到重复的向量,将它们相加,然后将它们除以列表的大小,结果值(向量)将替换重复的向量。
例如,a
是 ND 数组的列表,a = [[2,3,1],[5,65,-1],[2,3,1]]
,那么第一个和最后一个元素是重复的。他们的总和
将是:[4,6,2]
,它将除以向量列表的大小,size = 3
。
输出:a = [[4/3,6/3,2/3],[5,65,-1],[4/3,6/3,2/3]]
我尝试使用计数器
,但它不适用于 ndarray。
Numpy 的方式是什么?谢谢。
如果您有 numpy 1.13 或更高版本,这非常简单:
def f(a):
u, inv, c = np.unique(a, return_counts = True, return_inverse = True, axis = 0)
p = np.where(c > 1, c / a.shape[0], 1)[:, None]
return (u * p)[inv]
如果你没有 1.13,你需要一些技巧来转换 a
首先进入一维数组。我推荐 @Jaime 的优秀答案,使用 np.void
here
它是如何工作的:
-
u
是 a
的唯一行(通常不按原来的顺序)
-
c
是u
每行出现的次数a
中重复
-
inv
是要获取u
的索引返回a
,即u[inv] = a
-
p
是 u
每行的乘数根据您的要求。 1
如果c == 1
和c / n
(其中 n
是 a
中的行数)如果 c > 1
。 [:, None]
将其转换为列向量,以便它可以通过 u
很好地广播
返回u * p
按 [inv]
索引回其原始位置
我是一名优秀的程序员,十分优秀!