我有一个1x1024
1-d数组(扁平图像)。要查看图像,我想将其大小重塑为32x32
我可以通过执行x.reshape(-1,32)
轻松实现这一点,并且它按照我的预期工作。它不会破坏图像。它每次读取宽度为32步的1d数组
比如说这一次,共有4幅图像,大小为32×8。什么是重塑这一切的安全方法? 步幅定义背后的逻辑是什么?是否总是从最大尺寸开始(例如,3d->;2d->;1d)?好像是
In [2]: a = np.arange(1024)
In [3]: a.reshape(4,32,8)
Out[3]:
array([[[ 0, 1, 2, ..., 5, 6, 7],
[ 8, 9, 10, ..., 13, 14, 15],
[ 16, 17, 18, ..., 21, 22, 23],
...,
[ 232, 233, 234, ..., 237, 238, 239],
[ 240, 241, 242, ..., 245, 246, 247],
[ 248, 249, 250, ..., 253, 254, 255]],
[[ 256, 257, 258, ..., 261, 262, 263],
[ 264, 265, 266, ..., 269, 270, 271],
[ 272, 273, 274, ..., 277, 278, 279],
...,
[ 488, 489, 490, ..., 493, 494, 495],
[ 496, 497, 498, ..., 501, 502, 503],
[ 504, 505, 506, ..., 509, 510, 511]],
[[ 512, 513, 514, ..., 517, 518, 519],
[ 520, 521, 522, ..., 525, 526, 527],
[ 528, 529, 530, ..., 533, 534, 535],
...,
[ 744, 745, 746, ..., 749, 750, 751],
[ 752, 753, 754, ..., 757, 758, 759],
[ 760, 761, 762, ..., 765, 766, 767]],
[[ 768, 769, 770, ..., 773, 774, 775],
[ 776, 777, 778, ..., 781, 782, 783],
[ 784, 785, 786, ..., 789, 790, 791],
...,
[1000, 1001, 1002, ..., 1005, 1006, 1007],
[1008, 1009, 1010, ..., 1013, 1014, 1015],
[1016, 1017, 1018, ..., 1021, 1022, 1023]]])
In [4]: a.reshape(4,-1,8)
Out[4]:
array([[[ 0, 1, 2, ..., 5, 6, 7],
[ 8, 9, 10, ..., 13, 14, 15],
[ 16, 17, 18, ..., 21, 22, 23],
...,
[ 232, 233, 234, ..., 237, 238, 239],
[ 240, 241, 242, ..., 245, 246, 247],
[ 248, 249, 250, ..., 253, 254, 255]],
[[ 256, 257, 258, ..., 261, 262, 263],
[ 264, 265, 266, ..., 269, 270, 271],
[ 272, 273, 274, ..., 277, 278, 279],
...,
[ 488, 489, 490, ..., 493, 494, 495],
[ 496, 497, 498, ..., 501, 502, 503],
[ 504, 505, 506, ..., 509, 510, 511]],
[[ 512, 513, 514, ..., 517, 518, 519],
[ 520, 521, 522, ..., 525, 526, 527],
[ 528, 529, 530, ..., 533, 534, 535],
...,
[ 744, 745, 746, ..., 749, 750, 751],
[ 752, 753, 754, ..., 757, 758, 759],
[ 760, 761, 762, ..., 765, 766, 767]],
[[ 768, 769, 770, ..., 773, 774, 775],
[ 776, 777, 778, ..., 781, 782, 783],
[ 784, 785, 786, ..., 789, 790, 791],
...,
[1000, 1001, 1002, ..., 1005, 1006, 1007],
[1008, 1009, 1010, ..., 1013, 1014, 1015],
[1016, 1017, 1018, ..., 1021, 1022, 1023]]])
In [5]: a.reshape(4,8,32)
Out[5]:
array([[[ 0, 1, 2, ..., 29, 30, 31],
[ 32, 33, 34, ..., 61, 62, 63],
[ 64, 65, 66, ..., 93, 94, 95],
...,
[ 160, 161, 162, ..., 189, 190, 191],
[ 192, 193, 194, ..., 221, 222, 223],
[ 224, 225, 226, ..., 253, 254, 255]],
[[ 256, 257, 258, ..., 285, 286, 287],
[ 288, 289, 290, ..., 317, 318, 319],
[ 320, 321, 322, ..., 349, 350, 351],
...,
[ 416, 417, 418, ..., 445, 446, 447],
[ 448, 449, 450, ..., 477, 478, 479],
[ 480, 481, 482, ..., 509, 510, 511]],
[[ 512, 513, 514, ..., 541, 542, 543],
[ 544, 545, 546, ..., 573, 574, 575],
[ 576, 577, 578, ..., 605, 606, 607],
...,
[ 672, 673, 674, ..., 701, 702, 703],
[ 704, 705, 706, ..., 733, 734, 735],
[ 736, 737, 738, ..., 765, 766, 767]],
[[ 768, 769, 770, ..., 797, 798, 799],
[ 800, 801, 802, ..., 829, 830, 831],
[ 832, 833, 834, ..., 861, 862, 863],
...,
[ 928, 929, 930, ..., 957, 958, 959],
[ 960, 961, 962, ..., 989, 990, 991],
[ 992, 993, 994, ..., 1021, 1022, 1023]]])
reshape
不会对基础值重新排序。该数组存储为字节的1d数组,加上shape
、strides
和dtype
,用于view
将其作为特定多维数组存储您可以查看“步幅”属性:
对于1d,它一次只需步进8个字节(大小为
int64
)对于2d,256=32*8;要遍历行,必须执行256字节的步骤
对于3d,2048=32*8*8;街区之间的台阶
为了好玩,请看转置:
形状和步幅都发生了逆转
通常,当将图像阵列重塑为块时,我们需要重塑为小块,进行部分转置,然后重塑为目标。第一次重塑和转置创建了一个视图,只是在玩形状和步幅。但最后一次重塑通常需要复制
相关问题 更多 >
编程相关推荐