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

这个问题已经回答了,但我认为这个解决方案更通用。它也可以通过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 回答
0

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

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

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 回答