3

私は次のことを実行するためのNumpy(つまりより高速な)方法を探しています:

import numpy as np                                                              

x = np.array([1,2,3,4,5],dtype=np.double)                                       
arr = [[1,2],[0,4,3],[1,4,0],[0,3,4],[1,4]]                                 

ans = np.array([ x[item] - x[i] for i, item in enumerate(arr) ])

リスト内包表記を削除して、このようなことをしたいのですが(ただし、これは機能しないことはわかっています)

x[arr[:]] - x[:]

arrは常に、長さが。の長さに等しい整数のネストされたリストですx。内部リストは必ずしも同じ長さではありません(つまりarr、不規則なリストです)

4

1 に答える 1

0

Numpyのマスクされた配列を使用するアプリケーションに十分なソリューションを考え出しました。私のアプリケーションでは、arrリストは「不規則すぎ」ではありません(つまり、内部リストの最大長は、内部リストの最小長と極端に異なることはありません)。したがって、最初にsでパディングarr-1、次にsの位置に基づいてマスクを作成します-1。操作を実行し、結果の配列にマスクを使用します。この場合、(パディングされたエントリに対して)不必要に実行される追加の計算がいくつかありますが、これはPythonループよりも高速です(ほぼ2倍)。サンプルコードは次のとおりです。

import numpy as np                                                              
import numpy.ma as ma

x = np.array([1,2,3,4,5],dtype=np.double)                                       
arr = [[1,2],[0,4,3],[1,4,0],[0,3,4],[1,4]]                                     

max_arr_length = max([ len(item) for item in arr ])                          

arr_padded = [ np.pad(i,(0,max_arr_length-len(i)), mode='constant', 
    constant_values=-1) for i in arr ]
arr_masked = ma.masked_equal(arr_padded,-1)

ans_masked = ma.masked_array(x[arr_masked] - x[:, None], mask=arr_masked.mask)

これはちょっとしたハックですが、私にとっては十分に機能します。Numpyがジャグ配列をサポートしていればいいのにと思います。

于 2013-01-02T15:19:46.770 に答える