11

2D numpy 配列の数値ビニングを行うための高速な定式化を探しています。ビニングとは、サブマトリックスの平均または累積値を計算することを意味します。例のために。x = numpy.arange(16).reshape(4, 4) は、それぞれ 2x2 の 4 つのサブマトリックスに分割され、numpy.array([[2.5,4.5],[10.5,12.5]]) (2.5=numpy) が得られます。 average([0,1,4,5]) など...

このような操作を効率的に実行する方法...これを実行する方法がまったくわかりません...

どうもありがとう...

4

3 に答える 3

19

配列の高次元ビューを使用して、余分な次元に沿って平均を取ることができます。

In [12]: a = np.arange(36).reshape(6, 6)

In [13]: a
Out[13]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

In [14]: a_view = a.reshape(3, 2, 3, 2)

In [15]: a_view.mean(axis=3).mean(axis=1)
Out[15]: 
array([[  3.5,   5.5,   7.5],
       [ 15.5,  17.5,  19.5],
       [ 27.5,  29.5,  31.5]])

(a, b)一般に、配列の形状のビンが必要な場合は、その形状を変更(rows, cols)する必要があります.reshape(rows // a, a, cols // b, b)。また、 の順序.meanが重要であることに注意してください。たとえば、次元が 3 つしかないa_view.mean(axis=1).mean(axis=3)ため、エラーが発生します。問題なく動作しますが、何が起こっているのかを理解するのが難しくなります。a_view.mean(axis=1)a_view.mean(axis=1).mean(axis=2)

As is, the above code only works if you can fit an integer number of bins inside your array, i.e. if a divides rows and b divides cols. There are ways to deal with other cases, but you will have to define the behavior you want then.

于 2013-02-17T01:01:46.277 に答える
0

あなたの例のように、うまく機能し、配列で何かを行う関数を一般的に構築する方法だけを知りたいと思いnumpy.reshapeます。したがって、パフォーマンスが本当に重要で、すでに numpy を使用している場合は、numpy のように独自の C コードを作成できます。たとえば、arangeの実​​装は完全に C です。パフォーマンスの点で重要な numpy のほとんどすべてが C で実装されています。

ただし、そうする前に、Python でコードを実装してみて、パフォーマンスが十分かどうかを確認する必要があります。Pythonコードをできるだけ効率的にするようにしてください。それでもパフォーマンスのニーズに合わない場合は、C の方法を使用してください。

ドキュメントでそれについて読むことができます。

于 2013-02-17T00:40:05.963 に答える