2016-12-18 7 views
-2

ここでは、興味深い観察です:ndarry:高価ndarray反復で

1 import numpy as np 
2 data = np.array([[255,255,255], [0, 0, 255], [255, 0, 0]], np.int8) 
3 for i in range(1000000): 
4 for row in data: 
5  for col in row: 
6   flag = col > 0 

上記のコードが終了する〜17秒かかります。私は

data = data.tolist() 

を実行して一覧表示するdataを変換する場合は、全体のことは最後まで< 1秒かかります。

知っておきたいこと: 1. ndarray値比較の効率が低い理由は何ですか? 2. ndarrayをリストに変換しないと、比較を行うより適切な方法は何ですか?それをリストに隠すよりも効率的でしょうか?

ありがとうございました!

--------------編集した質問:-------------

@hpauljが指摘したように、それは反復ではありません値の比較は非常に高価です。しかし、私は配列を反復する必要があります。それをリストに変換するよりも良い方法はありますか?

+0

値の比較は高価ではなく、繰り返しです。あなたは配列全体に比較を適用することになっています。 – hpaulj

+0

バグが見つかりました:np.int8タイプは255を格納できません。-128〜127しか格納できない符号付きタイプです。したがって、データはnp.array([[ - 1、-1、-1]、[0、0、-1]、[-1、0、0]]、np.int8) 'になります。 – gzc

+0

@hpaulj Ya。合意したただ考えた。しかし、私はndarray全体を反復する必要があります。もっと良い方法? – cheng

答えて

0

Why is a `for` over a Python list faster than over a Numpy array?

配列上で繰り返しを行う方法の質問が速く頻繁に来て - と最高の答えは「ない」である、というか、コンパイルに反復を押しますnumpyコード。 Pythonレベルでの明示的な反復を大幅に高速化する方法はありません。いくつかのトリックは2倍のスピードアップをもたらすかもしれませんが、桁違いのオーダーはありません。

あなたのケースでは、答えはit depends on what you are doing at each iterationです。回答はgzc'sと表示されているので、要素ごとに比較を実行することができます。numpyという表現が1つあります。そのアクションを実行するために反復する必要はありません。

1

より適切かつ効果的な方法は、数値的な要素ごとの比較を使用することです。サイドバーから

for i in range(1000000): 
    flag = data > 0