我有一个ND阵列(矢量)列表,每个矢量都有一个(1,300)
形状。
我的目标是在列表中找到重复的向量,对它们求和,然后将它们除以列表的大小,结果值(向量)将替换重复的向量。
例如,a
是ND数组的列表,a = [[2,3,1],[5,65,-1],[2,3,1]]
,然后第一个和最后一个元素是重复的。他们的sum
将是:[4,6,2]
,将按照矢量列表size = 3
的大小进行划分。
输出:a = [[4/3,6/3,2/3],[5,65,-1],[4/3,6/3,2/3]]
我曾尝试使用Counter
,但它不适用于ndarrays。
Numpy的方式是什么?谢谢。
如果你有1.13或更高的numpy,这很简单:
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
转换为1-d数组。我推荐@ Jaime使用np.void
here的优秀答案
这个怎么运作:
u
是a
的独特行(通常不是原始顺序)c
是在u
重复每排a
的次数inv
是让u
回到a
的指数,即u[inv] = a
p
是根据您的要求每排u
的乘数。 1
if c == 1
和c / n
(其中n
是a
的行数)如果c > 1
。 [:, None]
将其转换为列向量,以便与u
进行良好的广播返回u * p
由[inv]
索引回原来的位置
您可以使用numpy unique,带计数返回计数
elements, count = np.unique(a, axis=0, return_counts=True)
返回计数允许返回数组中每个元素的出现次数
输出是这样的,
(array([[ 2, 3, 1],
[ 5, 65, -1]]), array([2, 1]))
然后你可以像这样乘以它们:
(count * elements.T).T
输出:
array([[ 4, 6, 2],
[ 5, 65, -1]])