2015年12月16日水曜日

pythonでnumpy用疎行列をつくる

代謝解析用ソフトウェアをpythonで書いています。疎行列を作成し、安定同位体の割合をnumpy.dot関数で計算します。その疎行列を作成する方法をいくつか試してみました。

100 * 100 の大きさで対角がすべて-1.0を作成します。

    data = 1.0
    for j in range(10000):
        x = numpy.zeros((100,100))
        for i in xrange(100):
            x[i][i] = data * -1.0

0.405 sec/10000回

    data = 1.0
    for j in range(10000):
        x = numpy.zeros(10000)
        for i in xrange(100):
            x[i*100+i] = data * -1.0
        x.resize((100,100))

0.296 sec/10000回


    for j in range(10000):
        y = [0.0] * 10000
        for i in xrange(100):
            y[i*100+i] = data * -1.0
        x = numpy.array(y)

        x.resize((100,100))

3.762 sec/10000回

でした。また、行列をべた書きするのも3-4秒かかることから、1次元のnumpy.arrayで作成し、numpy.resizeするのが最も高速。のようです。

もっと早くする方法があったら伝授のほどよろしくお願いします。