我有一个 python 矩阵
leafs = np.array([[1,2,3],[1,2,4],[2,3,4],[4,2,1]])
我想为每对行计算它们具有相同元素的次数。
在这种情况下,我会得到一个 4x4 矩阵接近度
proximity = array([[3, 2, 0, 1],
[2, 3, 1, 1],
[0, 1, 3, 0],
[1, 1, 0, 3]])
这是我目前使用的代码。
proximity = []
for i in range(n):
print(i)
proximity.append(np.apply_along_axis(lambda x: sum(x==leafs[i, :]), axis=1,
arr=leafs))
我需要一个更快的解决方案
编辑: 接受的解决方案在此示例中不起作用
>>> type(f.leafs)
<class 'numpy.ndarray'>
>>> f.leafs.shape
(7210, 1000)
>>> f.leafs.dtype
dtype('int64')
>>> f.leafs.reshape(7210, 1, 1000) == f.leafs.reshape(1, 7210, 1000)
False
>>> f.leafs
array([[ 19, 32, 16, ..., 143, 194, 157],
[ 19, 32, 16, ..., 143, 194, 157],
[ 19, 32, 16, ..., 143, 194, 157],
...,
[139, 32, 16, ..., 5, 194, 157],
[170, 32, 16, ..., 5, 194, 157],
[170, 32, 16, ..., 5, 194, 157]])
>>>
请您参考如下方法:
这是一种方法,使用广播。请注意:临时数组 eq 的形状为 (nrows, nrows, ncols),因此如果 nrows 为 4000 且 ncols 为 1000,eq 将需要 16GB 的内存。
In [38]: leafs
Out[38]:
array([[1, 2, 3],
[1, 2, 4],
[2, 3, 4],
[4, 2, 1]])
In [39]: nrows, ncols = leafs.shape
In [40]: eq = leafs.reshape(nrows,1,ncols) == leafs.reshape(1,nrows,ncols)
In [41]: proximity = eq.sum(axis=-1)
In [42]: proximity
Out[42]:
array([[3, 2, 0, 1],
[2, 3, 1, 1],
[0, 1, 3, 0],
[1, 1, 0, 3]])
另请注意,此解决方案效率低下:proximity 是对称的,对角线始终等于 ncols,但此解决方案计算完整数组,因此它做的更多比必要的工作量多两倍。
