加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 大型2D numpy数组中相同元素的高效成对计算

发布时间:2020-12-20 13:19:53 所属栏目:Python 来源:网络整理
导读:我有一个2D numpy数组,有数十万行和一千个左右的列(假设它是一个N×P数组,N = 200,000,P = 1000).这里的目标是计算每对行向量之间相同元素的数量,理想情况下使用numpy数组魔术,不需要我执行199,999 * 100,000个这样的对的循环.由于存储200,000×200,000阵列
我有一个2D numpy数组,有数十万行和一千个左右的列(假设它是一个N×P数组,N = 200,000,P = 1000).这里的目标是计算每对行向量之间相同元素的数量,理想情况下使用numpy数组魔术,不需要我执行199,999 * 100,000个这样的对的循环.由于存储200,000×200,000阵列可能不可行,因此输出可能是Nx3稀疏坐标格式,例如,如果输入的形式如下:

5 12 14 200   0 45223
7 12 14   0 200 60000
7  6 23   0   0 45223
5  6 14 200   0 45223

得到的(密集的)NxN矩阵M将是(不关心对角线元素):

0 2 2 4
2 0 2 1
2 2 0 3
4 1 3 0

假设基于0的索引,Mij包含初始行i和初始行j之间的相同元素的数量.
因此,预期的稀疏输出等价物将是:

0 1 2
0 2 2
0 3 4
1 2 2 
1 3 1
2 3 3

一种天真的,非常低效的实现方法是:

import itertools
import numpy as np

def pairwise_identical_elements(small_matrix):
    n,p = small_matrix.shape
    coordinates = itertools.combinations(range(n),2)
    sparse_coordinate_matrix = []
    for row1,row2 in itertools.combinations(small_matrix,2):
        idx1,idx2 = next(coordinates)
        count = p - np.count_nonzero(row1 - row2)
        sparse_coordinate_matrix.append([idx1,idx2,count])
    return sparse_coordinate_matrix

我已经研究了距离度量实现,例如scipy和sklearn中的Jaccard相似性,但它们都假设输入行向量必须是二进制的.我还尝试添加第三个维度以使条目成为二进制(例如,条目’9’成为零的向量,在第9个位置具有1)但是存在明显的内存问题(条目’45223’将需要第三维伸展那么多元素).

是否有一种高效,可扩展和/或pythonic解决方案使用numpy或scipy以我错过的方式?

编辑:在进一步研究scipy之后,我发现了一些与我正在尝试的东西非常匹配的东西,即具有汉明度量的scipy.sparse.distance.pdist.然而,它以“浓缩”形式返回输出,并且由于我们试图避免转换为完全密集阵列以节省内存,因此问题可能变成:如何将压缩距离矩阵转换为稀疏矩阵?

解决方法

正如评论中所说,scipy的 pdist带有’hamming’是解决这个问题的最简单有效的方法,无论是考虑空间还是考虑cpu时间.

你将无法像condensed output那样提高内存效率.实际上,当写入“稀疏”格式时,需要一个(N *(N-1)/ 2,3)矩阵,与pdist返回的N *(N-1)/ 2向量相比

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读