4

Python に次の行列があるとします。

[[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]

次のマトリックス(または象限/コーナー)にスライスしたい:

[[1,2], [5,6]]

[[3,4], [7,8]]

[[9,10], [13,14]]

[[11,12], [15,16]]

これは Python の標準のスライス演算子でサポートされていますか、それとも numpy のような拡張ライブラリを使用する必要がありますか?

4

4 に答える 4

10

常に4x4マトリックスで作業している場合:

a = [[1 ,2 , 3, 4],
     [5 ,6 , 7, 8],
     [9 ,10,11,12],
     [13,14,15,16]]

top_left =  [a[0][:2], a[1][:2]]
top_right = [a[0][2:], a[1][2:]]
bot_left =  [a[2][:2], a[3][:2]]
bot_right = [a[2][2:], a[3][2:]]

任意のサイズの行列に対して同じことを行うこともできます。

h = len(a)
w = len(a[1])
top_left =  [a[i][:w // 2] for i in range(h // 2)]
top_right = [a[i][w // 2:] for i in range(h // 2)]
bot_left =  [a[i][:w // 2] for i in range(h // 2, h)]
bot_right = [a[i][w // 2:] for i in range(h // 2, h)]
于 2012-10-10T04:37:58.827 に答える
0
>>> a = [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]
>>> x = map(lambda x:x[:2], a)
>>> x
[[1, 2], [5, 6], [9, 10], [13, 14]]
>>> y = map(lambda x: x[2:], a)
>>> y
[[3, 4], [7, 8], [11, 12], [15, 16]]
>>> x[:2] + y[:2] + x[2:] + y[2:]
[[1, 2], [5, 6], [3, 4], [7, 8], [9, 10], [13, 14], [11, 12], [15, 16]]
于 2012-10-10T04:56:32.557 に答える
0

答えは必要な解決策を提供できますが。これらは、異なるサイズの配列には適用されません。サイズが (6x7) の NumPy 配列がある場合、これらのメソッドはソリューションを作成しません。私は自分で解決策を用意しましたので、ここで共有したいと思います。

注: 私のソリューションでは、軸のサイズが異なるため、オーバーラップが発生します。天体画像を 4 つの象限に分割するために、このソリューションを作成しました。次に、これらの象限を使用して、環の平均と中央値を計算します。

import numpy as np
def quadrant_split2d(array):
    """Example function for identifiying the elements of quadrants in an array.
    array: 
        A 2D NumPy array.
    Returns:
        The quadrants. True for the members of the quadrants, False otherwise.
    """
    Ysize = array.shape[0]
    Xsize = array.shape[1]
    y, x = np.indices((Ysize,Xsize))
    if not (Xsize==Ysize)&(Xsize % 2 == 0): print ('There will be overlaps')
    sector1=(x<Xsize/2)&(y<Ysize/2)
    sector2=(x>Xsize/2-1)&(y<Ysize/2)
    sector3=(x<Xsize/2)&(y>Ysize/2-1)
    sector4=(x>Xsize/2-1)&(y>Ysize/2-1)
    sectors=(sector1,sector2,sector3,sector4)
    return sectors

さまざまなタイプの配列で関数をテストできます。例えば:

test = np.arange(42).reshape(6,7)
print ('Original array:\n', test)
sectors = quadrant_split2d(test)
print ('Sectors:')
for ss in sectors: print (test[ss])

これにより、次のセクターが得られます。

[ 0  1  2  3  7  8  9 10 14 15 16 17]
[ 3  4  5  6 10 11 12 13 17 18 19 20]
[21 22 23 24 28 29 30 31 35 36 37 38]
[24 25 26 27 31 32 33 34 38 39 40 41]
于 2019-02-27T11:34:37.383 に答える
0

質問はすでに回答されていますが、この解決策はより一般的だと思います。numpy.split次のように使用して、内包表記をリストすることもできます。

import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
B = [M for SubA in np.split(A,2, axis = 0) for M in np.split(SubA,2, axis = 1)]

取得:

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

それらを別の変数に割り当てたい場合は、次のようにします。

C1,C2,C3,C4 = B

numpy.split docをご覧ください。パラメータindices_or_sectionsを変更すると、分割数を増やすことができます。

于 2018-07-18T17:09:00.740 に答える