python row_python – 用于getrow的Scipy稀疏矩阵替代()

我正在使用大型稀疏二进制矩阵.我使用Scipy稀疏矩阵实现来压缩它们.从scipy.spatial.distance计算Jaccard距离不支持对稀疏矩阵的直接操作,因此:

>将整个稀疏矩阵转换为密集,然后在每一行上作为内存饥饿的向量进行操作

要么

>遍历稀疏,使用getrow()抓住每一行并运行.

要么

>编写我们自己的实现来处理稀疏矩阵.

为了正确看待,这里是示例代码:

import scipy.spatial.distance as d

import numpy as np

from scipy.sparse import csr_matrix

# benchmark performance

X = np.random.random((3000, 3000))

# binarize

X[X > 0.3] = 0

X[X>0] = 1

mat = csr_matrix(X)

a = np.zeros(3000)

a[4] = a[100] = a[22] =1

a = csr_matrix(a)

def jaccard_fast(v1,v2):

common = v1.dot(v2.T)

dis = (v1 != v2).getnnz()

if common[0,0]:

return 1.0-float(common[0,0])/float(common[0,0]+dis)

else:

return 0.0

def benchmark_jaccard_fast():

for i in range(mat.shape[0]):

jaccard_fast(mat.getrow(i),a)

def benchmark_jaccard_internal_todense():

for v1,v2 in zip(mat.todense(),a.todense()):

d.jaccard(v1,v2)

def benchmark_jaccard_internal_getrow():

for i in range(mat.shape[0]):

d.jaccard(mat.getrow(i),a)

pri

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于一个稀疏矩阵,我们可以将其表示为一个三元组的形式,即$A=(I,J,V)$,其,$I$和$J$分别表示非零元素在矩阵的行和列的坐标,$V$表示非零元素的值。对于一个$1000\times1000$的稀疏矩阵$A$,我们可以按照如下步骤进行归一化处理: 1. 对每一行进行归一化处理:对于第$i$行,我们可以计算其范数$\left\Vert A(i,:)\right\Vert_2$,然后将该行的每个元素除以该范数即可。 2. 对每一列进行归一化处理:对于第$j$列,我们可以计算其范数$\left\Vert A(:,j)\right\Vert_2$,然后将该列的每个元素除以该范数即可。 需要注意的是,在进行归一化处理时,我们只需考虑非零元素即可,因为零元素不会影响矩阵的范数。 具体实现可以参考以下代码(假设稀疏矩阵$A$已经被读入并存储在三元组$(I,J,V)$): ```python import numpy as np from scipy.sparse import coo_matrix # 构造稀疏矩阵 I = np.random.randint(0, 1000, size=(10000,)) J = np.random.randint(0, 1000, size=(10000,)) V = np.random.rand(10000,) + np.random.rand(10000,) * 1j A = coo_matrix((V, (I, J)), shape=(1000, 1000)) # 对每一行进行归一化处理 for i in range(1000): row = A.getrow(i) norm = np.linalg.norm(row.data) if norm > 0: row.data /= norm A.data[row.nnz*i : row.nnz*(i+1)] = row.data # 对每一列进行归一化处理 for j in range(1000): col = A.getcol(j) norm = np.linalg.norm(col.data) if norm > 0: col.data /= norm A.data[col.nnz*j : col.nnz*(j+1)] = col.data # 打印归一化后的稀疏矩阵 print(A.toarray()) ``` 其`coo_matrix`函数用于构造稀疏矩阵,`getrow`和`getcol`方法用于获取稀疏矩阵的行和列,`nnz`属性用于获取非零元素的个数,`toarray`方法用于稀疏矩阵转换为稠密矩阵并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值