将一个2D numpy数组分割成不均匀的部分

3

我在Python中有一个2D numpy数组,对应于在for循环中计算的图像。数组的大小为Nx40。我希望在每个循环步骤中将初始数组分割成大小为40x40(大约)的矩形数组。如果N不能被40整除,则最后一个图像应包含除法的余数。因此,例如87x40应为(40x40和47x40)。到目前为止,我所做的是:

div_num = spec.shape[0] / spec.shape[1]
remaining = spec.shape[0] % spec.shape[1]

lista = []
for i in range(1, div_num+1):
     img = spec[((i-1)*40):(i*40)][0:40]
     lista.append(img)

如何在最后一张图片中添加剩余的行?

在你的for循环中,你可以检查剩余的“行”数,然后使用if语句相应地定义img - Aristotelis
1个回答

6
您可以使用np.array_split来处理不均匀的切分,这个函数的表现非常出色。首先,我会初始化一个随机数组:
arr = np.random.randn(87, 40)

接下来,计算要分割的索引。如果arr的形状可被40整除,则生成均匀的分割。否则,溢出会进入第(n-1)个数组。

# compute the indices to split on
if arr.shape[0] % 40 == 0:
    split_idx = arr.shape[0] // 40
else:
    split_idx = np.arange(40, arr.shape[0], 40)[:-1]

最后,调用array_split函数,并在split_idx处进行分割:
# split along the 0th axis
splits = np.array_split(arr, split_idx, axis=0)

确认我们的数组已正确分区:

[s.shape for s in splits]
[(40, 40), (47, 40)]

在我的情况下,图像大小为81x40,结果是3个矩阵,其中两个为40x40,一个为1x40。该怎么避免这种情况呢?如果您使用81,40尝试您的代码,您会看到同样的问题。 - konstantin
最后一个问题,如果我有53x40的图像,如何设置20行的阈值,并在这种情况下保留一张图片,而当它是63x40时将其分成两个部分? - konstantin
@konstantin 这有点困难,但你可能可以修改生成 split_idx 的代码来完成它。 - cs95
好的,再次感谢!我想我需要稍微尝试一下else语句。 - konstantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接