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

python – 按行查找矩阵和矢量之间的交点

发布时间:2020-12-20 11:10:05 所属栏目:Python 来源:网络整理
导读:考虑以下: tmp1 = ['a','b','c','d','e']tmp2 = ['f','g','h','d']tmp3 = ['b','i','j','k','l']matr = np.array([tmp1,tmp2,tmp3])matr 产生一个矩阵: array([['a','e'],['f','d'],['b','l']],dtype='|S1') 现在,我想知道与向量相交的每一行中的值的总和.
考虑以下:

tmp1 = ['a','b','c','d','e']
tmp2 = ['f','g','h','d']
tmp3 = ['b','i','j','k','l']
matr = np.array([tmp1,tmp2,tmp3])

matr

产生一个矩阵:

array([['a','e'],['f','d'],['b','l']],dtype='|S1')

现在,我想知道与向量相交的每一行中的值的总和.说,

vec = ['a','f','b']
[sum([y in vec for y in row]) for row in matr]

返回,

[3,2,1]

这是所需的输出.它的问题是我的’matr’实际上是≈1000000x 2200,我有6700个向量来比较.我在这里的解决方案太慢而无法尝试.

我怎样才能改善我正在做的事情?

值得注意的是,matr里面的值来自一组~30000的值,而且我有完整的值.我已经考虑过这样的解决方案,我对每个向量做出这些30000值的字典,并且在按行求和之前使用dict在整个矩阵中转换为True / False.我不确定这是否会有所帮助.

解决方法

对于matr和vec作为数组,这里有一个 np.searchsorted

def count_in_rowwise(matr,vec):
    sidx = vec.argsort()
    idx = np.searchsorted(vec,matr,sorter=sidx)
    idx[idx==len(vec)] = 0
    return (vec[sidx[idx]] == matr).sum(1)

使用相对较小的vec,我们可以预先对它进行排序和使用,为我们提供另一种计算行数的方法,就像这样 –

def count_in_rowwise_v2(matr,vec,assume_sorted=False):
    if assume_sorted==1:
        sorted_vec = vec
    else:
        sorted_vec = np.sort(vec)
    idx = np.searchsorted(sorted_vec,matr)
    idx[idx==len(sorted_vec)] = 0
    return (sorted_vec[idx] == matr).sum(1)

上述解决方案适用于通用输入(数字或字符串).为了解决我们特定的字符串情况,我们可以通过使用np.unique将字符串转换为数字然后重新使用count_in_rowwise / count_in_rowwise_v2来进一步优化它,这将为我们提供第二种方法,就像这样 –

u,ids = np.unique(matr,return_inverse=True)
out = count_in_rowwise(ids.reshape(matr.shape),ids[np.searchsorted(u,vec)])

(编辑:李大同)

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

    推荐文章
      热点阅读