我有一个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)的对象。
答案 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
仅有一点区别:这里的nrows
和ncols
是每个方向上的块数,而不是每个块内的行/列数。
现在为了比较相同的示例数组:
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]])