2016-11-30 4 views
1

x、y座標の2次元配列を、以前の座標の各座標の距離のフラットな配列に変換するnumpy関数があります。Numpy - numpy関数をジェネレータに変換する

arr = np.asarray(input).astype(int) 
np.hstack((arr[0], (arr[:-1,:] - arr[1:,:]).ravel())) 

- Divakar's answer

input = [[-8081441,5685214], [-8081446,5685216], [-8081442,5685219], [-8081440,5685211], [-8081441,5685214]] 
output = [-8081441, 5685214, 5, -2, -4, -3, -2, 8, 1, -3] 

おかげで(Numpy - transform 2D array of x,y coordinates into flat array of distance between coordinatesを参照)、私は差別を複製するためにスライスして、私は

arr = np.asarray(input).astype(int) 
np.hstack((arr[0], (-np.diff(arr, axis=0)).ravel())) 

欲しいものを別のアプローチを行っている2つのnumpyの機能を持っています私の質問は、これらのnumpy関数の1つをジェネレータに変換してパフォーマンスを向上させる方法ですか?ジェネレータでnumpyを使用することは可能ですか?

+2

まず、時期尚早の最適化には注意してください、あなたは何をしたいん機能を持っています。第二に、発電機は本当にここであなたを助けていない。 Numpyの関数は、ベクトル表現から多くの速度を得ています。ベクトル化は、密な表現を必要とし、本質的に配列のすべての要素を同時に実行します。 – Erotemic

答えて

2

Pythonジェネレータは、リストのスピンオフです。

In [207]: [i*2 for i in range(3)] 
Out[207]: [0, 2, 4] 
In [208]: (i*2 for i in range(3)) 
Out[208]: <generator object <genexpr> at 0xb6a1ffbc> 
In [209]: list(_) 
Out[209]: [0, 2, 4] 

あなたはそれを怠け者リストと考えることができます。あなたがそれを反復するまで、要素を実際に評価するわけではありません。 Py3ではrangeがジェネレータ(Py2のxrange)です。 In[208]行はジェネレータを設定しますが、何も評価しません。それは速いです。しかし、[209]でそれを反復することは[207]でオリジナルと同じくらい時間がかかります。 (よく微妙な違いがあるかもしれません)。

したがって、ジェネレータを使用すると、すべての中間リストを作成せずに、リストのようにブロック内で考えることができます。それは、パフォーマンス組織よりもコード編成ツールです。

numpy配列で作業しているときは、何も同等のことは考えられません。

arr=np.array(input) # creates fixed size array from input list 
-np.diff(arr, axis=0) # create another array 

これは、中間体のアレイの数、偶数リストを作成し、配列を返す(および中間体を捨てる)終わる:

np.hstack((arr[0],(-np.diff(arr, axis=0)).ravel())) 

その発現の単純なビルディング・ブロックの数があります。 Numpyのスピードは、これらのステップを高速にコンパイルされたコードで実行することから来ています。スピードを上げるには、CまたはCythonで問題を書き直す必要があります。そのコードでは、繰り返し実行し、各ステップで複雑な操作を実行できます。

おそらくnumpyはある種の遅延評価を実行する可能性がありますが、それは大きな低レベルのコーディングを必要とします。また、パフォーマンスが向上する保証はありません。

私は中間バッファの問題を見て、とのパフォーマンスの向上(それはない)add.atかどうか:https://stackoverflow.com/a/40688879/901925

+0

ありがとうございます。最後に、最もパフォーマンスの高い関数は、ジェネレータでイテレータを使用しています([this answer](http://codereview.stackexchange.com/a/147908/68343)参照))。上記のナンシー関数は、複数の大きな座標の配列を処理するためにかなり遅くなりました。 –

関連する問題