将python矩阵切成象限

时间:2012-10-10 04:33:00

标签: python arrays matrix

假设我在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 个答案:

答案 0 :(得分:9)

如果您一直在使用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][:h / 2] for i in range(w / 2)]
top_right = [a[i][h / 2:] for i in range(w / 2)]
bot_left =  [a[i][:h / 2] for i in range(w / 2, w)]
bot_right = [a[i][h / 2:] for i in range(w / 2, w)]

答案 1 :(得分: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]]

答案 2 :(得分: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可以得到更多的分割。

答案 3 :(得分:0)

尽管答案可以提供所需的解决方案。这些不适用于不同大小的阵列。如果您的NumPy数组的大小为(6x7),则这些方法将不会创建解决方案。我已经为自己准备了一个解决方案,并希望在这里分享。

注意:在我的解决方案中,由于轴尺寸不同,会有重叠。 我创建了此解决方案,将天文图像划分为四个象限。然后,我使用这些象限来计算圆环的平均值和中位数。

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]