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

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

概述考虑以下: tmp1 = ['a', 'b', 'c', 'd', 'e']tmp2 = ['f', 'g', 'h', 'b', 'd']tmp3 = ['b', 'i', 'j', 'k', 'l']matr = np.array([tmp1, tmp2, tmp3])matr 产生一个矩阵: array([['a', 'b', 'c', 'd', 'e'], ['f', 'g 考虑以下:

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)])
总结

以上是内存溢出为你收集整理的python – 按行查找矩阵和矢量之间的交点全部内容,希望文章能够帮你解决python – 按行查找矩阵和矢量之间的交点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1192247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存