2017-08-26 18 views
2

私はnumpy配列を使用できるほどの性能を絞っています。Python 3のNUMPY配列にルックアップテーブルを適用する最も効率的な方法

私はルックアップテーブルを持っています。 MYLUT = [0,2,5,7,8,12、-1、...、229]

そして、私は(300,200000)形状のuint8の値でnumpyの配列myarrayのを持っている

何ルックアップテーブルをMYARRAYのすべての要素に適用する最も速い方法ですか?

現在、私はちょうどforループを使用しています:

for i in range(300) : 
    for j in range(200000) : 
     MYARRAY[i][j] = MYLUT[MYARRAY[i][j]] 

私はもっとうまくできますか?これは既にPythonでこれを行う最も速い方法ですか?

答えて

2

MYLUT[MYARRAY]は動作するはずです:


MYLUT = np.array([0,2,5,7,8,12,-1,229]) 
MYARRAY = np.random.randint(0,8,8).reshape(4,2) 

MYARRAY 
#array([[5, 4], 
#  [7, 5], 
#  [4, 3], 
#  [1, 5]]) 

new_array = np.empty_like(MYARRAY) 
for i in range(4) : 
    for j in range(2) : 
     new_array[i,j] = MYLUT[MYARRAY[i,j]] 

new_array 
#array([[ 12, 8], 
#  [229, 12], 
#  [ 8, 7], 
#  [ 2, 12]]) 

MYLUT[MYARRAY] 
#array([[ 12, 8], 
#  [229, 12], 
#  [ 8, 7], 
#  [ 2, 12]]) 
+0

これはnumpy.takeを使用すると少し速いようです。私がここに来てから、どうやって形の数え切れない配列を作成するのですか?(100,1000)行のすべての要素が行のインデックスの値を保持するので、行0では配列要素は[0,0 、... 0](< - a 1000)、最後の行は[999,999、... 999]となります。今ではリストの理解度を使ってnumpy.asarray()を使ってキャストしています – bFig8

+0

'np.repeat(np.arange(100)、1000).reshape(100,1000)'や 'np .broadcast_to(np.arange(100)[:, None]、(100、1000)) 'です。合計100行があるので、あなたは '999'と言うときに' 99'を意味すると思いますか? – Psidom

+1

ニース!ありがとう!ああ、そうだよ。それは[99,99、... 99]でなければならない。 – bFig8

3

numpyのは非常に効率的にこれを行うことができます:

arr = np.array([[1,2,3],[0,0,1]]) 
lut = np.array([0,2,5,7,8,12]) 
print(lut.take(arr)) 

それが与える:

array([[2, 5, 7], 
     [0, 0, 2]]) 

注意これはと同じことを行い。また、あなたのdtypeに注意を払うべきであることに注意してください。あなたのLUTに-1のデータがありますが、あなたのデータは署名されていないと言います。

あなたは超効率的になりたい場合は、あなたがtake()outパラメータを使用することができます

lut.take(arr, out=arr) 

新しい配列を作成回避し、所定の位置にarrを更新し、あなたの元のコードに似ています。

+0

返事ありがとう!コードは私のために働く! – bFig8

関連する問題