2

scipyスパース配列の構築におけるcopy引数の機能は何ですか?

scipy.sparse.lil_matrix(arg1, shape=None, dtype=None, copy=False)

何もしないようです!

別のマトリックスからスパース マトリックスを作成し、copy=False を明示的に設定すると、1 つのマトリックスを変更しても、もう 1 つのマトリックスは変更されません。

import scipy.sparse as sp
import numpy as np
A = sp.csc_matrix(np.array([[1,0],[0,0]]))
B = sp.csr_matrix(A, copy=False)
B[1,1] = 1 #editing B should change A but it does not 
print A.data, B.data #these values are different

ありがとう

4

1 に答える 1

2

CSC と CSR の両方の行列は、内部的に 3 つの 1D 配列として表されます。これら 3 つの配列は、まったく同じデータを表している場合でも、通常、形式が異なると異なります。したがって、同じデータを指しているが異なる形式でアクセスする疎行列オブジェクトを作成する必要はありません。

このcopy引数でできることは、同じデータを指す同じ形式の 2 つの疎行列オブジェクトを持つことです。例えば:

a = sps.csr_matrix([[1, 0], [0, 0]])
b = sps.csr_matrix(a, copy=False)

>>> a.data
array([1])
>>> b.data
array([1])
>>> a[0, 0] = 2
>>> a.data
array([2])
>>> b.data
array([2])

これには制限もあります。たとえば、CSR (および CSC) 形式の場合、既存の値を単純に変更するのではなく、新しい配列をインスタンス化する必要があるため、スパース構造を壊すとデータの共通性が失われます。

>>> a[1, 1] = 5
>>> a.data
array([2, 5])
>>> b.data
array([2])
于 2013-05-31T20:06:20.197 に答える