2

50,000x50,000 の疎行列/2 次元配列を保持する必要があり、セルの約 5% が均一に分散され、空ではありません。私はする必要があります:

編集numpy/scipy でこれを行う必要があります。明確でない場合は申し訳ありません。また、要件を追加しました。

  1. DB から 5% の空でないデータを読み取り、それをマトリックス/2 次元配列セルにできるだけ早く割り当てます。
  2. できるだけ少ないメモリを使用してください。
  3. ファンシー インデックスを使用します (たとえば、列内のすべての空でない値のインデックスを取得します)。これは、メモリと構築時間のほうが重要です。
  4. 一度構築されると、マトリックスは変更されません。
  5. ただし、できれば O(1) のメモリと時間で転置したいと思います。

これを達成する最も効率的な方法は何ですか?「空の」セルを示すために、ゼロの代わりに nan を保持できますか? (0 は私にとって有効な値です)、nansum、nanmean を効率的に実行できますか? そうでない場合、特定の列/行のゼロ以外のすべてのインデックスと値を効率的に取得できますか?

4

2 に答える 2

1

さて、私の目的のためには、cscが進むべき道のようです。5%の「スパースファクター」を使用しても、cscの行インデックスが使用するメモリはそれだけの価値があります。これが私が必要なものが本当に速いことをテストするために使用したコードです:

def build_csc(N, SPARSITY_FACTOR):

    data = []
    row_indexes = []
    column_indexes = [0] * (N+1)

    current_index = 0
    for j in xrange(N):
        column_indexes[j] = current_index
        for i in xrange(N):
            if random.random() < SPARSITY_FACTOR:
                row_indexes.append(i)
                data.append(random.random())
                current_index += 1
    column_indexes[N] = current_index

    return sp.csc_matrix((data,row_indexes,column_indexes), shape=(N,N), dtype=np.float)


def take_from_col(m, col_index):
    col = m[:,col_index]
    indexes = col.nonzero()[0]
    values = col[indexes]

これを実行する%timeitと、これは確かに高速であることがわかります。

于 2012-12-07T16:35:33.713 に答える
1

http://en.wikipedia.org/wiki/Sparse_matrixには、いくつかの異なる方法の優れた要約があります。Web サイトから取得したデータが順序付けされていない場合は、「List of Lists」(この場合はより効率的 - おそらく列と値のペアのリストの配列) をお勧めします。順序を保証できる場合は、「Yale 形式」をお勧めします。これらのソリューションは両方とも NAN の保存を不要にし、nanmean/nanaverage を高速にします。

ただし、これらのソリューションでは挿入が遅くなります。これらのソリューションは、完全なマトリックスのスペースの約 10% を使用します。

于 2012-12-07T12:14:47.453 に答える