58
type(A)
<class 'scipy.sparse.csc.csc_matrix'>
A.shape
(8529, 60877)
print A[0,:]
  (0, 25)   1.0
  (0, 7422) 1.0
  (0, 26062)    1.0
  (0, 31804)    1.0
  (0, 41602)    1.0
  (0, 43791)    1.0
print A[1,:]
  (0, 7044) 1.0
  (0, 31418)    1.0
  (0, 42341)    1.0
  (0, 47125)    1.0
  (0, 54376)    1.0
print A[:,0]
  #nothing returned

今私が理解していないのはA[1,:]、2行目から要素を選択する必要があるということですが、1行目から。を介して要素を取得しprint A[1,:]ます。また、print A[:,0]最初の列を返す必要がありますが、何も出力されません。なんで?

4

4 に答える 4

63

A[1,:]それ自体が形状(1、60877)のスパース行列です。 これは印刷しているものであり、行が1つしかないため、すべての行の座標は0です。

例えば:

In [41]: a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]])

In [42]: a.todense()
Out[42]: 
matrix([[ 1,  0,  0,  0],
        [ 0,  0, 10, 11],
        [ 0,  0,  0, 99]], dtype=int64)

In [43]: print(a[1, :])
  (0, 2)    10
  (0, 3)    11

In [44]: print(a)
  (0, 0)    1
  (1, 2)    10
  (1, 3)    11
  (2, 3)    99

In [45]: print(a[1, :].toarray())
[[ 0  0 10 11]]

列を選択できますが、列にゼロ以外の要素がない場合は、次のように出力しても何も表示されませんprint

In [46]: a[:, 3].toarray()
Out[46]: 
array([[ 0],
       [11],
       [99]])

In [47]: print(a[:,3])
  (1, 0)    11
  (2, 0)    99

In [48]: a[:, 1].toarray()
Out[48]: 
array([[0],
       [0],
       [0]])

In [49]: print(a[:, 1])


In [50]:

列にゼロ以外の要素がないため、最後のprint呼び出しでは出力が表示されません。a[:, 1]

于 2013-02-27T15:34:16.277 に答える
33

質問の詳細とは異なる手法を使用してタイトルの質問に回答するには:

csc_matrixメソッドを提供します.nonzero()

与えられた:

>>> import numpy as np
>>> from scipy.sparse.csc import csc_matrix
>>> 
>>> row = np.array( [0, 1, 3])
>>> col = np.array( [0, 2, 3])
>>> data = np.array([1, 4, 16])
>>> A = csc_matrix((data, (row, col)), shape=(4, 4))

ゼロ以外のデータにポニッティングするインデックスには、次の方法でアクセスできます。

>>> rows, cols = A.nonzero()
>>> rows
array([0, 1, 3], dtype=int32)
>>> cols
array([0, 2, 3], dtype=int32)

これを使用して、スパース行列の密なバージョンを作成しなくても、データにアクセスできます。

>>> [((i, j), A[i,j]) for i, j in zip(*A.nonzero())]
[((0, 0), 1), ((1, 2), 4), ((3, 3), 16)]
于 2017-08-20T21:26:22.293 に答える
4

を使用してTFIDFスコアを計算する場合TfidfTransformer、yuはによってIDFを取得できます tfidf.idf_。次に、スパース配列名、たとえば「a」、a.toarray().

toarrayndarrayを返します。todense行列を返します。行列が必要な場合は、todense;を使用します。それ以外の場合は、を使用しますtoarray

于 2018-04-09T17:48:36.117 に答える
2

私は他のすべての与えられた答えを完全に認めます。これは単に異なるアプローチです。

この例を示すために、新しいスパース行列を作成しています。

from scipy.sparse.csc import csc_matrix
a = csc_matrix([[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]])
print(a)

出力:

(0, 0)  1
(1, 2)  10
(1, 3)  11
(2, 3)  99

リストにアクセスするのと同じように、これに簡単にアクセスできるように、リストに変換しました。

temp_list = []
for i in a:
    temp_list.append(list(i.A[0]))

print(temp_list)

出力:

[[1, 0, 0, 0], [0, 0, 10, 11], [0, 0, 0, 99]]

スパース行列を作成して元に戻すため、これはばかげているように見えるかもしれませんが、 TfidfVectorizerなどの一部の関数は、スパース行列を出力として返し、それらを処理するのは難しい場合があります。これは、スパース行列からデータを抽出する1つの方法です。

于 2018-06-26T11:27:40.633 に答える