python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)

    print(train_set.tdm)
    print(type(train_set.tdm))

输出得到:

  (0, 3200)    0.264940780338
  (0, 1682)    0.356545827856
  (0, 3875)    0.404535449364
  (0, 2638)    0.375094236628
  (0, 2643)    0.420086333071
  (0, 558)    0.332314202381
  (0, 2383)    0.215711023304
  (0, 3233)    0.304884643652
  (0, 3848)    0.26822694041
  (1, 1682)    0.0679433740085
  (1, 3586)    0.186001809282
  (1, 1748)    0.224453998729
  (1, 4369)    0.217962362491
  (1, 4102)    0.321977101868
  (1, 3717)    0.11571865147
  (1, 1849)    0.23976007391
  (1, 3019)    0.105831301914
  (1, 2731)    0.133236987271
  (1, 2284)    0.158959982269
  (1, 1129)    0.224453998729
  (1, 4004)    0.14716429302
  (1, 1113)    0.224453998729
  (1, 1239)    0.23282317344
  (1, 4439)    0.17621324335
  (1, 4075)    0.111234138548
  :    :
  (3297, 4296)    0.189022497666
  (3297, 1273)    0.173257613112
  (3297, 611)    0.189022497666
  (3297, 1639)    0.201945480138
  (3297, 1401)    0.196076146399
  (3297, 800)    0.193531186809
  (3297, 4442)    0.213804760507
  (3298, 2383)    0.115351969953
  (3298, 3848)    0.143434978411
  (3298, 3480)    0.166989458436
  (3298, 767)    0.208015125433
  (3298, 3836)    0.115469714921
  (3298, 3877)    0.132381892057
  (3298, 4387)    0.302243669544
  (3298, 2967)    0.182430066726
  (3298, 4184)    0.170734583655
  (3298, 3878)    0.131142324027
  (3298, 3381)    0.202336034891
  (3298, 3959)    0.299487688552
  (3298, 1392)    0.257499357524
  (3298, 3039)    0.266066529253
  (3298, 3599)    0.27026191686
  (3298, 4289)    0.302243669544
  (3298, 484)    0.36124988755
  (3298, 2037)    0.36124988755
<class ‘scipy.sparse.csr.csr_matrix‘>

说明这个变量train_set.tdm是个scipy.sparse.csr.csr_matrix,类似稀疏矩阵,输出得到的是矩阵中部位0的行列坐标及值,现在我们要挑出每一行中值最大的k项。

首先我们知道一个对于稀疏矩阵很方便函数:

    #输出非零元素对应的行坐标和列坐标
    nonzero=train_set.tdm.nonzero()
    #nonzero是个tuple
    print(type(nonzero))
    print(nonzero[0])
    print(nonzero[1])
    print(nonzero[1][0])

输出为:

<class ‘tuple‘>
[   0    0    0 ..., 3298 3298 3298]
[3200 1682 3875 ..., 4289  484 2037]
3200
其实train_set.tdm是我文本挖掘tf-idf后得到的权重矩阵,
我要挑出每天记录中权重最大的76个词,根据权重从大到小输出这些词的字典编号到excel我用一个class来存储这些非零格子的两个信息:一个是这个词权重信息,一个是这个词的字典编号,lis来存一条记录的所有权重非零词的信息,gather则是所有lis的集合,代码如下:
    class obj:
    def __init__(self):
        self.key=0
        self.weight=0.0

    k=0 #k用来记录是不是一条记录结束了
    lis=[]
    gather=[]
    p=-1 #p用来计数,每走一遍循环+1
    for i in nonzero[0]:#i不一定每循环就+1的,它是nonzero【0】里的数,不懂可以看之前输出的nonzero【0】
        p=p+1
        print(i)
        if k==i:
            a=obj()
            a.key=nonzero[1][p]#这个词的字典编号就是它属于第几列
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
        else:
            lis.sort(key=lambda obj: obj.weight, reverse=True)#对链表内为类对象的排序
            #print(lis)
            gather.append(lis)
            while k < i:
                k=k+1
            lis=[]
            a=obj()
            a.key=nonzero[1][p]
            a.weight=train_set.tdm[i,nonzero[1][p]]
            lis.append(a)
    gather.append(lis)

最后就是输出到excel中

    myexcel = xlwt.Workbook()
    sheet = myexcel.add_sheet(‘sheet‘)
    #si,sj表示输出到第几行第几列
    si=-1
    sj=-1
    for i in gather:
        si=si+1
        for j in i:
            sj=sj+1
            sheet.write(si,sj,str(j.key))
        while sj<=76:
            sj=sj+1
            sheet.write(si,sj,‘-1‘)#要是没有那么多词组就用-1代替
        sj=-1
    myexcel.save("attribute76.xls")

就如下所示:

 

原文地址:https://www.cnblogs.com/caiyishuai/p/9362133.html

时间: 2024-10-11 15:57:26

python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)的相关文章

Python scipy.sparse矩阵使用方法

本文以csr_matrix为例来说明sparse矩阵的使用方法,其他类型的sparse矩阵可以参考https://docs.scipy.org/doc/scipy/reference/sparse.html csr_matrix是Compressed Sparse Row matrix的缩写组合,下面介绍其两种初始化方法 csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)]) where data, row_ind and col_ind s

python—类对象和实例对象的区别

最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行调用.这段通讯层的代码实质上做了五件事: 第一:加载dll: 第二:初始化dll内的通讯参数: 第三:与服务器进行连接,创建session 第四:把数据senbuffer通过sessionManger发送给服务器 第五:取得的数据返回recibuffer def testlogin(ip,port,

最小(大)堆找出数组的最小(大)的k项值

//最小堆实现 void MyGlobal::min_heapify(int *a, int* b,int left, int right) { int child = 0; int tmp = 0; int tempb = 0; int parent = left; assert(a != NULL); for (tmp = a[parent],tempb=b[parent]; LEFTSON(parent) <= right; parent = child) { child = LEFTSO

7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式: 输出倒数第K个位置上的数据.如果这个位置不存在,输出错误信息NULL. 输入样例: 4 1 2 3 4 5 6 7 8 9 0 -1 输出样例: 7 解题思路:寻找倒数第K项,这里所用的方法是定义两个指针,让第一个指针先走k步,然后两个指针一起移动,第一个指针移到末尾的时候,第二个指针就到了倒数

7-19 求链式线性表的倒数第K项

7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式: 输出倒数第K个位置上的数据.如果这个位置不存在,输出错误信息NULL. 输入样例: 4 1 2 3 4 5 6 7 8 9 0 -1 输出样例: 7思路:待定 原文地址:https://www.cnblogs.com/zengguoqiang/p/

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

WPF{ComboBox绑定类对象, 下拉列显示的值,与取到的值}

DisplayMemberPath 是用来显示下拉列表的值 SelectedValuePath是用来取得选中项的值. ComboBox绑定类对象, 下拉列显示的值,与取到的值 string. Join的作用 输出结果是

Python SciPy Sparse模块学习笔记

1. sparse模块的官方document地址:http://docs.scipy.org/doc/scipy/reference/sparse.html 2. sparse matrix的存储形式有很多种,见此帖子http://blog.csdn.net/anshan1984/article/details/8580952 不同的存储形式在sparse模块中对应如下: bsr_matrix(arg1[, shape, dtype, copy, blocksize]) Block Sparse

查找第K大的值

这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ i$,$j$且 $i != j $有$b[] = abs(x[i] - x[j])$ 问新序列的中位数是什么,如果新序列的长度为偶数那么我们定义中位数为排序后第len/2位置的那个数 解法: 相当于问新序列中的第K大的数多少. 注意新数列不可能全都算出来. 二分答案,二分那个第K大的数的值. $x