在numpy中组合稀疏和蒙版数组

时间:2016-02-24 16:29:38

标签: numpy sparse-matrix

是否有一种方便的方法可以在稀疏矩阵上使用掩码数组?

因为在使用scipy稀疏矩阵创建掩码数组时,看起来掩码不起作用...

一个典型的应用程序是一个邻接矩阵,其中值可以是{0,1,?},用于表示网络中的链接{0,1}和未知/看不见的值{?}来预测。

1 个答案:

答案 0 :(得分:1)

我并不感到惊讶,试图给出一个稀疏矩阵来掩盖不起作用。使用稀疏函数的少数numpy函数是将任务委托给稀疏代码的函数。

有可能构造一个coo格式矩阵,其中data属性是一个蒙面数组,但我怀疑这是否存在。通常不会masked识别的代码会忽略掩码。

掩码数组是ndarray子类,它维护两个属性,即数据和掩码,两者都是数组。许多蒙版方法的工作方法是使用适当的值(0为sums,1为产品)填充蒙版值,并执行常规数组计算。

稀疏矩阵不是ndarray子类。一种格式实际上是字典子类。大多数将数据存储在3个数组中,即2个坐标和数据。与非稀疏数组的交互通常涉及todense()将操作转换为常规numpy

设计没有互操作性。如果某些东西确实有效,那可能是因为某种巧合的方法授权。

例如

In [85]: A=sparse.coo_matrix(np.eye(3))
In [86]: M=np.ma.masked_array(np.eye(3))
In [87]: A+M
Out[87]: 
masked_array(data =
 [[ 2.  0.  0.]
 [ 0.  2.  0.]
 [ 0.  0.  2.]],
             mask =
 False,
       fill_value = 1e+20)

In [88]: M+A
NotImplementedError: adding a nonzero scalar to a sparse matrix is not supported

我原本期望M+A可以正常工作,但是因为我把它看作是为一个蒙面添加稀疏。但有时x+y实际上是y.__add__(x)A+np.eye(3)适用于两个订单。