Skip to main content
 首页 » 编程设计

python之如何快速计算 numpy.array 中的相等元素

2025年05月04日15bhlsheji

我有一个 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,但此解决方案计算完整数组,因此它做的更多比必要的工作量多两倍。