Python 将一维阵列拆分为二维块,而不重塑形状或增加步长
假设有一个图像(5x5): 我得到一个平坦的灰度图像数组,如: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,
[ 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])