54762


Python3で作成した内積を計算するプログラムの高速化を検討しております。

下記ソースコードの以下の部分がボトルネックとなっております。

[code]

    dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec)) 
    
[/code]

ここは内積を計算する部分です。この部分を高速化することは可能でしょうか？  
なお、試しにCythonでやってみましたが、エラーが出力されました。Cythonではlamdaはサポートされていないようです。  
お手数ですが、ご助力頂けると大変助かります。

[code]

    import numpy as np
    import time as t
    
    np.random.seed(0)
    xyz = np.random.rand(4, 100000, 3)
    vec = np.random.rand(3, 100000)
    
    def main():
    
        start = t.time()
    
        x = np.array(xyz[:, :, 0])
        y = np.array(xyz[:, :, 1])
        z = np.array(xyz[:, :, 2])
    
        cvec = vec[:, :]
    
        p0 = np.array([x.T, y.T, z.T])
        p0 = [p0[:, i, :] for i in range(100000)]
        p_ref = np.array([x[0], y[0], z[0]])
        d_vec = p0 - np.repeat(p_ref, 4).reshape(100000, 3, 4)
    
        dat0 = list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))
    
        print('time : ' + str(round((t.time() - start),5)) + ' [sec]')
    
    if __name__ == "__main__":
        main()
    
[/code]


CC BY-SA 4.0
2019-05-05T15:46:19.327
54753
2019-05-07T06:02:14.050
2019-05-07T06:02:14.050
2238
34194
question
python python3 numpy
内積計算の高速化


1案ですが、`numpy.einsum`を使って以下のようにするのはどうでしょうか。  
計算結果の形式がarrayのlistではなく、多次元のarrayにはなりますが。  
(以下のコードの`new_dat0`は元のコードの`dat0`を`np.array()`で型変換したものと等しいはずです)。

[code]

    def main():
    
        start = t.time()
    
        x = np.array(xyz[:, :, 0])
        y = np.array(xyz[:, :, 1])
        z = np.array(xyz[:, :, 2])
    
        cvec = vec[:, :]
    
        p0 = np.array([x.T, y.T, z.T])
        p0 = [p0[:, i, :] for i in range(100000)]
        p_ref = np.array([x[0], y[0], z[0]])
        d_vec = p0 - np.repeat(p_ref, 4).reshape(100000, 3, 4)
    
        #dat0 = np.array(list(map(lambda x, y: np.dot(x, y), cvec.T, d_vec))) 
        new_dat0 = np.einsum("ij,ijk->ik", cvec.T, d_vec)
    
        print('time : ' + str(round((t.time() - start),5)) + ' [sec]')
    
[/code]

私の手元の環境※だと実行時間の差は以下になりました。  
元々のコード：time : 0.22087 [sec]  
新しいコード：time : 0.10792 [sec]

※python 3.7.2, numpy 1.16.2


CC BY-SA 4.0
2019-05-06T01:48:22.537
54762
2019-05-06T01:48:22.537
12561
54753
answer