4

次の形式の numpy ベクトルのリストがあります。

    [array([[-0.36314615,  0.80562619, -0.82777381, ...,  2.00876354,2.08571887, -1.24526026]]), 
     array([[ 0.9766923 , -0.05725135, -0.38505339, ...,  0.12187988,-0.83129255,  0.32003683]]),
     array([[-0.59539878,  2.27166874,  0.39192573, ..., -0.73741573,1.49082653,  1.42466276]])]

ここでは、リスト内の 3 つのベクトルのみが表示されます。私は100を持っています..

1 つのベクトルの最大要素数は約 1,000 万です

リスト内のすべての配列の要素数は等しくありませんが、要素の最大数は固定されています。最大サイズよりも小さいベクトルの要素の代わりにゼロがあるように、Python でこれらのベクトルを使用して疎行列を作成することは可能ですか?

4

3 に答える 3

3

これを試して:

from scipy import sparse
M = sparse.lil_matrix((num_of_vectors, max_vector_size))

for i,v in enumerate(vectors):
     M[i, :v.size] = v

次に、このページを見てください: http://docs.scipy.org/doc/scipy/reference/sparse.html

このlil_matrix形式はマトリックスを作成するのに適していますが、csr_matrix操作する前に別の形式に変換する必要があります。

于 2013-08-26T21:35:16.890 に答える
2

このアプローチでは、しきい値より下の要素を で置き換えて0から、それらから疎行列を作成します。coo_matrix目的に応じて他のタイプに変換するのが最も速いので、私は を提案しています。次にscipy.sparse.vstack()、リスト内のすべての要素を説明するマトリックスを作成できます。

import scipy.sparse as ss
import numpy as np

old_list = [np.random.random(100000) for i in range(5)]

threshold = 0.01
for a in old_list:
    a[np.absolute(a) < threshold] = 0
old_list = [ss.coo_matrix(a) for a in old_list]
m = ss.vstack( old_list )
于 2013-08-26T21:37:09.730 に答える
1

少し複雑ですが、おそらく次のようにします。

>>> import scipy.sparse as sps
>>> a = [np.arange(5), np.arange(7), np.arange(3)]
>>> lens = [len(j) for j in a]
>>> cols = np.concatenate([np.arange(j) for j in lens])
>>> rows = np.concatenate([np.repeat(j, len_) for j, len_ in enumerate(lens)])
>>> data = np.concatenate(a)
>>> b = sps.coo_matrix((data,(rows, cols)))
>>> b.toarray()
array([[0, 1, 2, 3, 4, 0, 0],
       [0, 1, 2, 3, 4, 5, 6],
       [0, 1, 2, 0, 0, 0, 0]])
于 2013-08-26T21:44:28.210 に答える