[英]Numpy arrays - Convert a 3D array to a 2D array
具有以下3D数组(9,9,9):
np.arange(729).reshape((9,9,9))
[[[ 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 25 26]
[ 27 28 29 30 31 32 33 34 35]
[ 36 37 38 39 40 41 42 43 44]
[ 45 46 47 48 49 50 51 52 53]
[ 54 55 56 57 58 59 60 61 62]
[ 63 64 65 66 67 68 69 70 71]
[ 72 73 74 75 76 77 78 79 80]]
...
[[648 649 650 651 652 653 654 655 656]
[657 658 659 660 661 662 663 664 665]
[666 667 668 669 670 671 672 673 674]
[675 676 677 678 679 680 681 682 683]
[684 685 686 687 688 689 690 691 692]
[693 694 695 696 697 698 699 700 701]
[702 703 704 705 706 707 708 709 710]
[711 712 713 714 715 716 717 718 719]
[720 721 722 723 724 725 726 727 728]]]
我如何重塑它看起来像这个2D数组(27,27):
[[0 1 2 3 4 5 6 7 8 81 82 83 84 85 86 87 88 89 162 163 164 165 166 167 168 169 170]
[9 10 11 12 13 14 15 16 17 90 91 92 93 94 95 96 97 98 171 172 173 174 175 176 177 178 179]
...
[558 559 560 561 562 563 564 565 566 639 640 641 642 643 644 645 646 647 720 721 722 723 724 725 726 727 728]
您可以首先将数组重塑为4d数组,交换第二和第三轴,然后将其重塑为27 X 27:
a.reshape(3,3,9,9).transpose((0,2,1,3)).reshape(27,27)
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 81, 82, 83, 84,
# 85, 86, 87, 88, 89, 162, 163, 164, 165, 166, 167, 168, 169,
# 170],
# [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 90, 91, 92, 93,
# 94, 95, 96, 97, 98, 171, 172, 173, 174, 175, 176, 177, 178,
# 179],
# ...
# [558, 559, 560, 561, 562, 563, 564, 565, 566, 639, 640, 641, 642,
# 643, 644, 645, 646, 647, 720, 721, 722, 723, 724, 725, 726, 727,
# 728]])
import numpy as np
x = np.arange(729).reshape(9, 9, 9)
y = x.transpose(1, 0, 2).reshape(27, 27)
y[y[:,2].argsort()]
说明
我使用numpy.transpose
来排列每个轴的步幅和形状信息。
>>> x.strides
(324L, 36L, 4L)
>>> x.transpose(1, 0, 2).strides
(36L, 324L, 4L)
此答案中的更多信息。
然后我按预期使用numpy.reshape
的3D (9L, 9L, 9L)
>>> x.reshape(27, 27)
(27L, 27L)
当然,在numpy
,功能的组合(例如transpose
和reshape
)非常常见。 它使您可以单线完成此矩阵转换:
x.transpose(1, 0, 2).reshape(27, 27)
编辑
正如@PaulPanzer指出的那样,数组未排序。
要按列对数组进行排序 ,可以使用:
y[y[:,2].argsort()]
但这也许不再是最简单的答案。
如果可以在列表中移动数据,可以使用:
np.hstack([x for x in np.arange(729).reshape((9,9,9))])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.