3

いくつ2D arraysかの数値プロセスの出力として、1x1, 3x3, 5x5, ...さまざまな解像度に対応する形の数値があります。

ステージでは、平均、つまり形状の 2D 配列値をnxn生成する必要があります。出力の形状が一貫している場合、つまり、11x11ソリューション内のすべてが明白であると言う場合、次のようになります。

element_wise_mean_of_all_arrays.

ただし、この投稿の問題については、配列の形状が異なるため、明らかな方法は機能しません!

kronfunctionを使用すると役立つかもしれないと思ったのですが、そうではありませんでした。例えば、配列が17x17作り方の形になっている場合21x21。したがって1x1、 、3x3、... からの他のすべてについて、一定の形状の配列を構築するには、 とし21x21ます。また、ターゲット形状と比較して、アレイの形状が小さくなったり大きくなったりする場合もあります。それは31x31に縮小されるの配列です21x21

この問題は、縮小または拡大される画像の非常に一般的なタスクとして想像できます。

2Dnumpy、scipyなどを使用して、Pythonで配列で同じジョブを実行するための効率的なアプローチは何ですか?

更新: 以下は、受け入れられた回答の少し最適化されたバージョンです。


def resize(X,shape=None):
    if shape==None:
        return X
    m,n = shape
    Y = np.zeros((m,n),dtype=type(X[0,0]))
    k = len(X)
    p,q = k/m,k/n
    for i in xrange(m):
        Y[i,:] = X[i*p,np.int_(np.arange(n)*q)]
    return Y

それは完璧に機能しますが、効率の点で最良の選択であることに皆さんは同意しますか? 改善しない場合は?


# Expanding ---------------------------------

>>> X = np.array([[1,2,3],[4,5,6],[7,8,9]])
[[1 2 3]
 [4 5 6]
 [7 8 9]]

>>> resize(X,[7,11])
[[1 1 1 1 2 2 2 2 3 3 3]
 [1 1 1 1 2 2 2 2 3 3 3]
 [1 1 1 1 2 2 2 2 3 3 3]
 [4 4 4 4 5 5 5 5 6 6 6]
 [4 4 4 4 5 5 5 5 6 6 6]
 [7 7 7 7 8 8 8 8 9 9 9]
 [7 7 7 7 8 8 8 8 9 9 9]]

# Shrinking ---------------------------------

>>> X = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]

>>> resize(X,(2,2))
[[ 1  3]
 [ 9 11]]

最後の注意:Fortran上記のコードは、可能な限り最高のパフォーマンスを得るために簡単に変換できます。

4

1 に答える 1

3

あなたが何をしようとしているのか正確に理解しているかどうかはわかりませんが、最も簡単な方法は次のとおりだと思います。

wanted_size = 21
a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b = numpy.zeros((wanted_size, wanted_size))

for i in range(wanted_size):
    for j in range(wanted_size):
        idx1 = i * len(a) / wanted_size
        idx2 = j * len(a) / wanted_size
        b[i][j] = a[idx1][idx2]

b[i][j] = a[idx1][idx2] を、a[idx1][idx2] を中心とする 3x3 行列の平均などのカスタム関数または補間関数に置き換えることができます。

于 2012-01-24T09:19:16.397 に答える