我想用数组中给出的标量来划分稀疏矩阵的行。
例如:我有一个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]
但这似乎很慢。如何在稀疏矩阵中有效地做到这一点?
答案 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)
附注
感谢亚历山大·基林