Scipy稀疏矩阵中的行划分

时间:2018-03-13 10:44:25

标签: python numpy scipy sparse-matrix

我想用数组中给出的标量来划分稀疏矩阵的行。

例如:我有一个csr_matrix C:

C = [[2,4,6], [5,10,15]]
D = [2,5]

我希望除法后的C结果为:

result = [[1, 2, 3], [1, 2, 3]]

我已经尝试使用我们用于numpy数组的方法:

result = C / D[:,None]

但这似乎很慢。如何在稀疏矩阵中有效地做到这一点?

4 个答案:

答案 0 :(得分:3)

方法#1

这是一个使用indexing -

手动复制的稀疏矩阵解决方案
from scipy.sparse import csr_matrix

r,c = C.nonzero()
rD_sp = csr_matrix(((1.0/D)[r], (r,c)), shape=(C.shape))
out = C.multiply(rD_sp)

输出是稀疏矩阵,也与C / D[:,None]的输出相反,后者创建了一个完整的矩阵。因此,提出的方法可以节省内存。

使用np.repeat而不是索引 -

进行复制可能会提升性能
val = np.repeat(1.0/D, C.getnnz(axis=1))
rD_sp = csr_matrix((val, (r,c)), shape=(C.shape))

方法#2

另一种方法可能涉及稀疏矩阵的data方法,它为我们提供了in-place结果的稀疏矩阵的平面视图,并且还避免使用nonzero,如此 - < / p>

val = np.repeat(D, C.getnnz(axis=1))
C.data /= val

答案 1 :(得分:0)

一行代码:result = [[C[i][j]/D[i] for j in range(len(C[0]))] for i in range(len(D))]

C = [[2,4,6], [5,10,15]] #len(C[0]) = 3
D = [2,5] # len(D) = 2
result = [[C[i][j]/D[i] for j in range(len(C[0]))] for i in range(len(D))]
print result

答案 2 :(得分:0)

如果您首先强制转换#include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 10 void bubble_sort(char str[SIZE][100]); int main (void) { char names[SIZE][100]; int i, j; for (i = 0; i < SIZE; i++) { printf("Enter names: "); scanf("%s", names[i]); } bubble_sort(names); for (int i = 0; i < SIZE; i++) printf ("%s\n", names[i]); } void bubble_sort(char str[SIZE][100]) { int i, j, reorder = 0; char temp; for (i = 1; i < SIZE; i++) { for (j = SIZE - 1; j >= i; j--) { if (strcmp(str[j], str[j + 1]) > 0) { strcpy(temp, str[j + 1]); strcpy(str[j + 1], str[j]); strcpy(str[j], temp); reorder = 1; } } if (reorder == 0) return; } } 来键入D(我假设除非numpy.matrix太大而无法放入内存,否则您可以这样做),那么您就可以运行

D

得到想要的东西。

答案 3 :(得分:0)

问题:我想用数组中给定的标量划分稀疏矩阵的行。 例如: C = [[2,4,6], [5,10,15]] D = [2,5]

答案:使用由稀疏矩阵接口提供的 "multiply" - 它允许“逐点”乘以矩阵以及向量和标量

<块引用>
    C = [[2,4,6], [5,10,15]]
    D = [2,5]

从 scipy.sparse 导入 csr_matrix

<块引用>

c = csr_matrix(C)
c2 = c.multiply(1/np.array(D).reshape(2,1))

<块引用>

c2.toarray()

'输出:'数组([[ 2, 4, 6], [ 5, 10, 15]], dtype=int64)

附注

感谢亚历山大·基林