Python 将一维阵列拆分为二维块,而不重塑形状或增加步长

Python 将一维阵列拆分为二维块,而不重塑形状或增加步长,python,Python,假设有一个图像(5x5): 我得到一个平坦的灰度图像数组,如: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] 我需要将其拆分为块,给定块大小为3,并且知道宽度和高度(5x5),而不使用数组切片、重塑或步长超过1,因为代码稍后也将在C中实现: [[0, 1, 2, 5, 6, 7, 10, 11, 12], [3, 4, 8,

假设有一个图像(5x5):

我得到一个平坦的灰度图像数组,如:

[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
我需要将其拆分为块,给定块大小为3,并且知道宽度和高度(5x5),而不使用数组切片、重塑或步长超过1,因为代码稍后也将在C中实现:

[[0,  1,  2, 5,  6,  7, 10, 11, 12], 
[3,  4, 8,  9, 13, 14], 
[15, 16, 17, 20, 21, 22], 
[18, 19, 23, 24]]
到目前为止,我已经做了以下工作,它根据窗口大小而不是宽度和高度进行分割

WIDTH = 5
HEIGHT = 5
windowsize = 3

image = np.arange(0, WIDTH*HEIGHT)

arrays = []
for _ in range(0, (WIDTH*HEIGHT)//windowsize+windowsize):
    arrays.append([])

for i in range(0, len(image)):
    print ("append", image[i], "to index", (i // windowsize))

    arrays[i // windowsize].append(image[i])

print (arrays)

这是尽可能非Pythonic的,但转换为C应该相当容易:

windowSize = 3
WIDTH      = 5
HEIGHT     = 5

#flattened...
image = list(range(WIDTH*HEIGHT))

arrays = []

for v in range(0,HEIGHT,windowSize):
    for h in range(0,WIDTH,windowSize):
        block = []
        for r in range(v,min(v+windowSize,WIDTH)):
            for c in range(h,min(h+windowSize,HEIGHT)):
                block.append(image[r*WIDTH+c])
        arrays.append(block)

for block in arrays: print(block)

[0, 1, 2, 5, 6, 7, 10, 11, 12]
[3, 4, 8, 9, 13, 14]
[15, 16, 17, 20, 21, 22]
[18, 19, 23, 24]
诀窍是水平和垂直地跨过图像,从窗口的左上角跨过下一个。然后根据这些坐标构建块,但不超过图像尺寸

或者,您可以预先分配阵列阵列,只需在图像中运行以将数据馈送到其中:

hCount = (WIDTH-1) // windowSize + 1
vCount = (HEIGHT-1) // windowSize + 1
arrays = [ list() for _ in range(hCount*vCount) ]
for i in range(HEIGHT*WIDTH):
    b   = i // WIDTH // windowSize * hCount + i % WIDTH // windowSize
    arrays[b].append(image[i])      

没有解释预期输出是如何获得的。@BillHuang你是什么意思?问题中描述了这一点。这看起来很有希望。然而,正如我在问题中所描述的,图像实际上是一个扁平阵列。这意味着
image=image.flatte()
image[r][c]
无效。对不起,我忽略了这一部分。现在修好了。你是个救生员。非常感谢。
hCount = (WIDTH-1) // windowSize + 1
vCount = (HEIGHT-1) // windowSize + 1
arrays = [ list() for _ in range(hCount*vCount) ]
for i in range(HEIGHT*WIDTH):
    b   = i // WIDTH // windowSize * hCount + i % WIDTH // windowSize
    arrays[b].append(image[i])