pixel bin/pixel bucket numpyの配列、つまりN
の連続するピクセルのグループを、置き換えられたピクセルの合計である単一のピクセルで置き換えます。たとえば、値で開始します。私の知る限りでは、特にこれを行い何numpyの機能はありません(修正してくださいPythonのnumpyのN次元ピクセルビニング/バケットのリファレンス実装を作ってみましょう
bucket(x, bucket_size=2)
= [1+3, 7+3, 2+9]
= [4, 10, 11]
:
x = np.array([1, 3, 7, 3, 2, 9])
2のバケットサイズで、これは変身します私が間違っていると私!)、私は頻繁に自分自身を転がす。 1D numpyのアレイでは、これは悪いことではありません。
import numpy as np
def bucket(x, bucket_size):
return x.reshape(x.size // bucket_size, bucket_size).sum(axis=1)
bucket_me = np.array([3, 4, 5, 5, 1, 3, 2, 3])
print(bucket(bucket_me, bucket_size=2)) #[ 7 10 4 5]
...しかし、私は、多次元の場合のために簡単に混乱し、私は、この「簡単」に私自身のバギー、中途半端ソリューションを転がり終わります問題が何度も繰り返される。素敵なN次元のリファレンス実装を確立できれば、それが大好きです。
好ましく関数呼び出しが(おそらく
bucket(x, bucket_size=(2, 2, 3))
のようなもの)を異なる軸に沿って異なるビンサイズを可能にする好ましくは、溶液が合理的に効率的である(再形成し、合計numpyの中でかなり速いです)
配列が整数バケットにうまく分割されない場合のエッジ効果を処理するためのボーナスポイント。
ユーザが最初のビンエッジオフセットを選択できるようにするボーナスポイント。
Divakarによって示唆されるように、ここに私の希望の動作は、サンプル2-Dの場合には:
x = np.array([[1, 2, 3, 4],
[2, 3, 7, 9],
[8, 9, 1, 0],
[0, 0, 3, 4]])
bucket(x, bucket_size=(2, 2))
= [[1 + 2 + 2 + 3, 3 + 4 + 7 + 9],
[8 + 9 + 0 + 0, 1 + 0 + 3 + 4]]
= [[8, 23],
[17, 8]]
...うまくいけば、私は正しく私の算術演算をしました;)
バケットの寸法は、アレイの対応する次元に分割しない場合、エラーが発生したと機能が全く実行されない - それはそうではないこと残りの要素は失われます。 (また、この回答は私が35分前に提案した方法と同じです:-)) –
私のテストではエラーは発生しません。私はview_as_blocksの補集合としてそれを書いています。これは正確な除算を強制します。遅れて申し訳ありません、私は考えなければなりませんでした;) –