相关文章推荐
风流倜傥的匕首  ·  单文件组件 | Vue.js·  7 月前    · 
风流倜傥的匕首  ·  Handling Application ...·  11 月前    · 
文雅的沙滩裤  ·  WKWebView拦截请求资源 ·  19 分钟前    · 
独立的眼镜  ·  如何连接Babelfish for RDS ...·  1小时前    · 
发财的蛋挞  ·  Microsoft Azure Data ...·  1小时前    · 
冷冷的投影仪  ·  Secure an ASP.NET ...·  2 小时前    · 
不羁的生姜  ·  PSPSDK 开发的时候出现 ...·  2 小时前    · 

SciPy是Python科学计算中的一个强有力的工具,尤其在使用稀疏矩阵时更加优秀。 下面我们将讨论如何使用NumPy对SciPy稀疏矩阵进行对称化。

阅读更多: Numpy 教程

什么是稀疏矩阵

稀疏矩阵是指在矩阵中0元素比非零元素多很多的矩阵。这种矩阵在计算机的存储中会存在大量浪费。因此,我们需要在不损失精度的情况下将其压缩,并在计算时加以利用。如下代码所示,我们通过SciPy包来创建一个5×5的稀疏矩阵:

import numpy as np
from scipy.sparse import csr_matrix
A = np.array([[0, 0, 0, 0, 0],
              [0, 0, 7, 0, 0],
              [0, 1, 4, 0, 0],
              [0, 0, 0, 0, 0],
              [0, 0, 0, 2, 0]])
sp = csr_matrix(A)
print('稀疏矩阵:\n', sp)

输出结果如下:

稀疏矩阵:
  (1, 2)        7
  (2, 1)        1
  (2, 2)        4
  (4, 3)        2

我们可以看到,稀疏矩阵只显示了非零元素的位置和值。在这个例子中,我们定义了一个5×5的矩阵。因为我们只在第二行第三列、第三行第二列、第三行第三列和第五行第四列中填入了值,所以我们只看到了这些非零值的位置和值。在我们的矩阵中有20个元素,只有4个元素是非零的,这就是稀疏矩阵的特点。

稀疏矩阵的对称性

对称矩阵是指矩阵中行和列元素对应相等的规律性矩阵,因此,对称矩阵只需要存储其中一半的元素即可。稀疏矩阵的对称矩阵,依然是稀疏矩阵。下面,我们来演示一下如何将稀疏矩阵转化成对称矩阵:

symetric_sp = sp + sp.T - csr_matrix(np.diag(sp.diagonal(), 0))
print('转换成对称矩阵后的稀疏矩阵:\n', symetric_sp)

输出结果如下:


转换成对称矩阵后的稀疏矩阵:
 (1, 2)        7
  (2, 1)        7
  (2, 2)        4
  (3, 3)        0
  (4, 3)        2
  (3, 4)        2

我们可以看到,转换后的对称矩阵仍然是稀疏矩阵。在这个例子中,我们通过csr_matrix函数将数组A转换成了稀疏矩阵sp。接着,我们利用sp.T(矩阵的转置)获取矩阵sp的转置矩阵,这个转置矩阵可以用来替代矩阵sp中的对应元素。最后,我们用csr_matrix(np.diag())获取了矩阵sp的主对角线数据,用来在转换后的对称矩阵上填对角线。这样,我们就得到了一个对称矩阵。

如果在处理后的稀疏矩阵中,有非零元素在对称矩阵中没有出现,这种情况下对称矩阵就不能完全反映出现矩阵的内容。在实际的应用场景中,这会影响矩阵处理的正确性。

对称矩阵的优势

对称矩阵中的数据具有一定的对称性,因此在人工处理中,对称矩阵往往比稀疏矩阵更加容易处理。同时,在代码实现中,对称矩阵也比稀疏矩阵更加轻便,可减少内存的消耗,提高程序运行效率。

在一些算法中,对称性是必须要保证的。例如,在使用共轭梯度方法解决一个线性方程预提中,需要对称矩阵来保证算法的一定收敛性。在数据科学中,对称矩阵相对稀疏矩阵的处理,需要的计算复杂度更的低。

本文通过几个简单的实例,介绍了SciPy稀疏矩阵和它的对称矩阵的概念,并演示了如何利用NumPy轻松实现对称矩阵的转换。在数据科学领域中,使用对称矩阵能够减少数据的冗余,降低计算所需的内存消耗,提高程序的效率。当你在下次处理稀疏矩阵时,可以尝试将其转换成对称矩阵并体验不同。


Numpy 问答
Numpy使用自定义谓词排序数组Numpy求解非方阵矩阵A的线性方程组Ax=bNumpy绘制不同长度的两个数组如何在Numpy中对二维数组进行分binNumpy 在Numpy Python中使用单冒号(:)和双冒号(::)的区别Numpy 为何感知器学习算法无法收敛Numpy 能否像 Matlab 一样快速计算稀疏矩阵的逆矩阵Numpy:合并两个NumPy数组以形成每个数组中最大值的数组Numpy Matlab/Octave和Python/C中的bwdist()方法如何使用Python中的Numpy和Matplotlib等库来绘制曼德博集合Numpy 和 Matplotlib 绘制对数数据时的问题,并设置其 x/y 范围Numpy如何向NUMPY数组中添加行和列介绍:如何使用ctypes的ndpointer传递null给外部库Numpy二维数组中插入0Numpy四舍五入至最近的binNumpy应用最后有效索引掩码到DataFrame中以获取最后有效值Numpy无法卸载的解决方案Numpy创建多进程数组时出现Segmentation fault问题Numpy 如何使用给定的坐标在图像中绘制点Numpy Pandas Dataframe - 从20年历史数据中删除某个小时的数据Numpy:计算累积中位数Numpy中的scipy.stats模块与numpy.random模块的区别Numpy:从内存中解码jpg图像的方法Numpy如何高效地实现元素级“in”的操作Numpy为什么比Pandas中的apply函数更快Numpy从CIFAR-10数据集中加载图像Numpy如何调整灰度图像直方图来实现高光/中调/阴影比例的要求Numpy/SciPy高斯模糊:如何避免图像转为灰度Numpy数组意外地相互影响Numpy Python将base64字符串绘制为图片Numpy和Sklearn两者的区别Numpy中如何在给定范围内生成随机日期在Cython中如何声明一个带有一般浮点类型的ndarray用Numpy更好的方法将单独的块组成块矩阵Numpy按照整型索引选择numpy数组轴Numpy使用numpy提取每行最小值Numpy中更好的四舍五入:NumPy.around函数的使用Numpy的np.arange与reshape方法介绍Numpy迭代多维数组的所有一维子数组Numpy中唯一点的查找Numpy中有没有替代Scipy中mode函数的函数Numpy矩形网格上的叉积Numpy 布尔数组的比较与 PEP8 E712Numpy 在三维空间中寻找圆弧/圆形方程Numpy中PCA的问题及解决方法Numpy:使numpy数组可JSON序列化Numpy Python神经网络:'numpy.ndarray'对象没有'dim'属性Numpy数组中两个“子集”之间的成对距离NumPy:Pandas的random_state具体是干什么的Numpy:使用Numpy数组作为查找表Numpy对Scipy稀疏矩阵的对称化Numpy将对象数组写入.txt文件Numpy IndexError: boolean index did not match indexed array along dimension 0错误使用NumPy过滤Pandas或NumPy数组中最小窗口长度的连续系列Numpy压缩文件在h5py中更大Numpy 应用:在 xarray 数据集上使用 numpy.polyfitNumpy防止创建多维数组使用seaborn为数据框绘制直方图Numpy Scipy, 差分进化算法介绍Numpy在Python中的多进程使用Numpy:如何序列化sympy lambdified函数Numpy 如何寻找最近的网格点Numpy中无需循环的多轴argmaxNumpy 如何在Pandas和Matplotlib中使用axNumpy 1/3次幂结果为复数的问题Numpy计算kurtosisNumpy:从Pandas数据框中编写格式化的二进制文件Numpy条件numpy.cumsumNumpy单个数组元素的参考Numpy如何在Python中设置和解决同时方程组Numpy:如何将Pandas系列中的数值时区转换Numpy按列排序浮点数数组Numpy: 将元组作为scipy.optimize.curve_fit的输入参数使用Numpy读取和操作Fortran有序数组的最佳实践Numpy:为什么在“numpy.asarray(...)”中出现“None”会引发未来警告Numpy 如何修改 2D 散点图以基于 CSV 文件中的第三个数组显示颜色Numpy数组计算平均数但保持形状Numpy中如何得到一维数组中所有元素的积Numpy中scipy最小二乘函数的Jacobian方法Numpy 中重写第三方模块的方法有多糟糕Numpy在Python中的使用Numpy数组以FORTRAN顺序转换为ctypesNumpy:如何强制让numpy ndarray拥有其内存Numpy 棋盘游戏:在限制红点的情况下寻找最大的绿点Numpy中的Python十进制对齐格式Numpy风格的文档字符串中如何描述kwargs参数Numpy 当我修改q1时,q1 = p却变成了q1 = p的副本,p也被修改了NumPy 中 DataFrame.div 和 DataFrame.divide 在 Pandas 中的区别Numpy 高斯拟合——在嘈杂和有趣的数据集上Numpy XGBoostError: b' src/metric/rank_metric.cc:89: Check failed: (preds.size()) == (info.labels.size()) label size predict size not match'错误Numpy中如何在使用Python的random choice时指定随机种子NumPy中的int和Python中的int的区别Numpy如何查看numpy.random.exponential源代码使用Numpy在第一维度上复制/重复二维数组以创建三维数组NumPy是否有类似Matlab的“buffer”函数Numpy 二轴下如何定义zorderNumpy 在执行器map-partition函数中,Numpy内存没有被释放导致内存泄漏的问题Numpy中 (n,) 的含义及其在向量中的应用Numpy 如何裁剪一个数组的零边缘使用Numpy从polyfit中找到不确定性Numpy中数组的重新缩放
 
推荐文章