假设我在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这样的扩展库?
答案 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]