更新csr_matrix的值

  • 便捷方式
  • 我的实现...

便捷方式

原文链接
稀疏矩阵如下

import numpy as np
from scipy.sparse importx = csr_matrix(np.array([[1, 0, 2, 0, 3], [0, 4, 0, 5, 0]]))

当需要将对其元素小于3的元素修改为0时,很容易想到这种方式

x[x < 3] = 0

但是这种方式在大型稀疏矩阵的情况下会报以下的警告

/home/miniconda3/lib/python3.6/site-packages/scipy/sparse/compressed.py:282: SparseEfficiencyWarning: Comparing a sparse matrix with a scalar greater than zero using < is inefficient, try using >= instead.warn(bad_scalar_msg, SparseEfficiencyWarning)

因为大型稀疏矩阵的情况下,大多数元素都为0,在用<号判断时,很多为0的元素也需要重新赋值,所以这种方式极其不好,可以看到warning中说到>=的判断要更有效率。

那么,我们可以这样来选取,不是所有小于3的元素都置为0,而是在所有非0元素中将小于3的置为0

nonzero_mask = np.array(x[x.nonzero()] < 3)[0]

然后就可以获取相应的行列

rows = x.nonzero()[0][nonzero_mask]
cols = x.nonzero()[1][nonzero_mask]
x[rows, cols] = 0print(x.todense())
# 最后消除掉0
x.eliminate_zeros()  # This happens inplace
[[0 0 0 0 3][0 4 0 5 0]]

我的实现…

在开发的过程中,经常涉及修改稀疏矩阵的值的操作,之前经常是直接通过csr_matrix的属性遍历修改,需要自己遍历实现修改data里面的内容

    import numpy as npfrom scipy.sparse import csr_matrixx = csr_matrix(np.array([[1, 0, 2, 0, 3], [0, 4, 0, 5, 0]]))print(x)print(x.toarray())row, col = x.shape# 当data[i][j] < 3时设置为0for i in range(row):for r in range(x.indptr[i], x.indptr[i+1]):if x.data[r] < 3:x.data[r] = 0print(x.toarray())

输出结果如下, 如果对csr_matrix中的indptr和data属性不清楚,可以参考稀疏矩阵的存储方式

1--- (0, 0)       1(0, 2)        2(0, 4)        3(1, 1)        4(1, 3)        5
2--- [[1 0 2 0 3][0 4 0 5 0]]
3--- [[0 0 0 0 3][0 4 0 5 0]]

修改csr_matrix的值相关推荐

  1. 转载非原创:修改BB 的内容,回车后修改CC 的值

    原文 http://blog.csdn.net/iamah/article/details/8438981 修改BB 的内容,回车后修改CC 的值 步骤: 1. 注册类为对类CL_GUI_ALV_GR ...

  2. 修改数组的值和多维数组排序

    foreach($ret as $key => $value) { //将数组元素中为空地补0,且添加sum元素的计算,注意修改数组的值,需要$key定位到是数组的哪一个地方需要修改,而不能简单 ...

  3. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题 参考文章: (1)VUE项目中使用this.$forceUpdate();解决 ...

  4. 学习旧岛小程序 (5) observer 函数中修改属性的值

    不要在一个属性的 observer  函数中修改属性的值 不然会造成内存泄露 错误代码: properties: {/* 期刊号 */index: {type: String,observer: fu ...

  5. 为什么不使用volatile,其它线程也能得到当前线程修改后的值,不使用volatile也不存在可见性问题?原来解决可见性问题不一定需要volatile,println也可以

    1. 为什么不使用volatile,其它线程也能得到变量修改后的值 实验代码分析: ①初始变量a=true,b=false: ②一个线程判断a或者b是否被改为相应逻辑,如果是,那么输出信息. ③修改a ...

  6. C# 【无法修改XX返回值,因为它不是变量】

    C# [无法修改XX返回值,因为它不是变量] using UnityEngine; using System.Collections; using System.Xml.Linq; using Uni ...

  7. SqlServer 增加字段,修改字段名,删除字段,修改字段默认值

    SqlServer 增加字段,修改字段名,删除字段,修改字段默认值 1:增加字段 语法:alter table 表名 add 新增字段名 字段类型 默认值- 2:修改字段名 语法:exec sp_re ...

  8. java反射设置属性值_Java反射如何有效的修改final属性值详解

    前言 以前写过一篇 Java 反射修改 final 属性值,本文将在这里重新温习一下Java反射如何有效的修改final属性值,下面话不多说了,来一起看看详细的介绍: 假设有个类 class Pers ...

  9. 全局变量-函数内部不允许修改局部变量的值

    # 全局变量 num = 10def demo1():# 希望修改全局变量的值# 在 python 中,是不允许直接修改全局变量的值# 如果使用赋值语句,会在函数内部,定义一个局部变量num = 99 ...

最新文章

  1. python csv文件读取行列_使用Numpy读取CSV文件,并进行行列删除的操作方法
  2. 网易宣布:招30人![免费加入]网易java人才培养计划!
  3. 五大软件设计原则学习笔记2——开放封闭原则
  4. redhat7.2 修改centos yum源
  5. python获取月份字符串_python - python从字符串获取日期 - 堆栈内存溢出
  6. AJAX和select,绑定值,动态加载select的Item值,设置所选的值 (全都是客户端控件)...
  7. MATLAB设置使用语言为中文
  8. Arcgis地籍图河流注记字体批量修改
  9. Linux命令之md5sum的作用以及使用方法(md5是什么?)
  10. Shell脚本三种循环
  11. Centos6.5 LAMP环境源码包安装与配置,附安装包百度网盘地址
  12. Java的各个应用平台
  13. JD token解密之旅
  14. Unity 3d 最新下载与安装
  15. JAVA黑马程序员day7(面向对象)
  16. css之-各种基本图形画法总结(css3.0)
  17. 控制系统的观测器基础知识
  18. 拨打电话通过蓝牙接通
  19. python练习题 11-20
  20. 安卓手机超强的悬浮窗工具

热门文章

  1. YOLOv5实战中国交通标志识别(TT100K数据集)
  2. 【408】计算机统考科目知识整理
  3. eclipse各版本说明与区别
  4. 论劳动者的休息权及其法律保障
  5. 后端质料springboot
  6. java 登录牵手_智慧职教2020Java程序基础章节答案
  7. 十大WEB安全问题(OWASP Top Ten Project-2017)
  8. ryu-manager报错SyntaxError: invalid syntax
  9. caffe代码阅读8: Data_layers的实现细节(各个数据读取层的实现细节) 2016.3.25-28
  10. 转:绝对论坛元老,05年注册。告诉你一个真实的魅族