将ndarray分割成不同的形状

时间:2018-07-11 15:20:41

标签: python numpy

我有一个20个ndarray对象的数组,形状为(640,480),对应于我正在处理的图像帧。

我想将这些ndarray对象中的每一个“划分”为8个较小的“块”,每个块的形状分别为(160,240),但似乎没有得到正确的结果。我目前正在尝试:

frames = [np.zeros((640, 480)) for _ in range(20)] # 20 "image frames"
res = [frame.reshape((240, 160, 8)) for frame in frames]

res最终等于一个形状为(160,240,8)的20个ndarray对象的数组,而我希望res等于一个数组子数组,其中每个子数组包含8个ndarray形状为(160,240)的对象。

2 个答案:

答案 0 :(得分:1)

我相信您想要做的是将2D数组拆分为多个块。  这个旧答案可能有助于您的查询:Slice 2d array into smaller 2d arrays

答案 1 :(得分:1)

那时已经提到的帖子Slice 2d array into smaller 2d arrays确实是一个很好的解决方案,但是如今我认为这可以更轻松地完成,因为numpy现在具有拆分功能,因此您的任务可以是一条线:

chunks = [np.vsplit(sub, nrows) for sub in np.hsplit(big_array, ncols)]
# with big_array, nrows and ncols replaced by variables/values relevant for you

仅有一点区别:这里的nrowsncols是每个方向上的块数,而不是每个块内的行/列数。

现在为了比较相同的示例数组:

c = np.arange(24).reshape((4,6))
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])

c_blocked  = [np.vsplit(sub, 2) for sub in np.hsplit(c, 2)]
[[array([[0, 1, 2],
         [6, 7, 8]]), array([[12, 13, 14],
         [18, 19, 20]])], [array([[ 3,  4,  5],
         [ 9, 10, 11]]), array([[15, 16, 17],
         [21, 22, 23]])]]

c_blocked[0][0]
array([[0, 1, 2],
       [6, 7, 8]])

c_blocked[0][1]
array([[12, 13, 14],
       [18, 19, 20]])

c_blocked[1][0]
array([[ 3,  4,  5],
       [ 9, 10, 11]])

c_blocked[1][1]
array([[15, 16, 17],
       [21, 22, 23]])