2017-03-07 3 views
4

den folgenden 3D-Array mit (9,9,9):Umwandlung von einem Numpy 3D-Array zu einem 2D-Array

>>> np.arange(729).reshape((9,9,9)) 
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 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]]]) 

Wie umformen ich es wie diese 2D-Array zu suchen (27,27):

enter image description here

Antwort

4

Sie müssen 6D mit einer Umbildung gehen grundsätzlich jede Achse in zwei aufzuteilen, transponieren dann Push zurück die geraden Achsen (2., 4. und 6.) bis zum Ende und einem abschließenden reshape zurück zu 2D -

a.reshape(-1,3,3,3,3,3).transpose(0,2,4,1,3,5).reshape(27,27) 

Probelauf -

In [28]: a = np.arange(729).reshape((9,9,9)) 

In [29]: out = a.reshape(-1,3,3,3,3,3).transpose(0,2,4,1,3,5).reshape(27,27) 

In [30]: out[0] 
Out[30]: 
array([ 0, 1, 2, 9, 10, 11, 18, 19, 20, 81, 82, 83, 90, 
     91, 92, 99, 100, 101, 162, 163, 164, 171, 172, 173, 180, 181, 182]) 

In [31]: out[1] 
Out[31]: 
array([ 3, 4, 5, 12, 13, 14, 21, 22, 23, 84, 85, 86, 93, 
     94, 95, 102, 103, 104, 165, 166, 167, 174, 175, 176, 183, 184, 185]) 

In [32]: out[2] 
Out[32]: 
array([ 6, 7, 8, 15, 16, 17, 24, 25, 26, 87, 88, 89, 96, 
     97, 98, 105, 106, 107, 168, 169, 170, 177, 178, 179, 186, 187, 188]) 

In [33]: out[3] 
Out[33]: 
array([ 27, 28, 29, 36, 37, 38, 45, 46, 47, 108, 109, 110, 117, 
     118, 119, 126, 127, 128, 189, 190, 191, 198, 199, 200, 207, 208, 209]) 

In [34]: out[-1] 
Out[34]: 
array([546, 547, 548, 555, 556, 557, 564, 565, 566, 627, 628, 629, 636, 
     637, 638, 645, 646, 647, 708, 709, 710, 717, 718, 719, 726, 727, 728]) 

Allgemein Fall Lösung

BSZ = [3,3] # Block size 
p,q = BSZ 
out = a.reshape(p,q,p,q,p,q).transpose(0,2,4,1,3,5).reshape(p**3,q**3) 
+2

Ich bin erstaunt, wie man in '6D' denken kann, nachdem man die Selbstähnlichkeit der" Sudoku "Blöcke gesehen hat! –

+0

Danke, das ist es genau! Aber was ist, wenn ich ein anderes "Ratio" habe, statt wie bei 3 mal 3, benutze a by b (das Zentrieren eines 3D-Arrays '(a * b, a * b, a * b)' zu einem 2D-Array '(a * a * a, b * b * b) ')? –

+0

@vasco_t Schauen Sie sich die soeben hinzugefügte 'Generic Case Lösung' an. Also, das ist BSZ = [a, b]. – Divakar

1

Divide and Conquer ist sehr für ein solches Problem. Es ist einfacher zu verstehen im Vergleich zu numpiger Magie. Und das kann nicht nur 27 * 27 Problem lösen, auch alle 3 Macht Probleme wie Fall 81 * 81. Zeigen Sie den Code zuerst.

import numpy as np 

# np.arange(729).reshape((9,9,9)).flatten() 
arr = np.arange(729) 

result = np.empty((27,27)) 

def assign(width, start, end, anchor_x, anchor_y): 
    if width > 3: 
     sub_width = width/3 
     for i in range(3): 
      for j in range(3): 
       assign(
        sub_width, 
        start + (i * 3 + j) * sub_width ** 2, 
        start + (i * 3 + j) * sub_width ** 2 + sub_width ** 2, 
        anchor_x + i * sub_width, 
        anchor_y + j * sub_width) 

    else: 
     result[anchor_x:anchor_x+3, anchor_y:anchor_y+3] = arr[start:end].reshape(3,3) 

assign(27, 0, 729, 0, 0) 

print(result) 

Erläuterung:

Jedes Mal, wenn Sie eine große n * n-Matrix bis 9 kleinere aufzuteilen (n/3) * (n/3) Matrix, und lösen sie sich rekursiv. Bis die Breite der Matrix gleich 3 ist, stoppe die Rekursion und kopiere 9 Zahlen (arr[start:end]) an result[anchor_x:anchor_x+3, anchor_y:anchor_y+3]

+0

Vielen Dank! Das löst auch das Problem. Aber was ist, wenn ich ein anderes "Ratio" habe, statt wie bei 3 mal 3, benutze a by b (das Zentrieren eines 3D-Arrays '(a * b, a * b, a * b)' zu einem 2D-Array '(a * a * a, b * b * b) ')? –

Verwandte Themen