2017-09-06 17 views
3

NumPyで3d配列を扱っています。配列要素を多く見なければなりません。私が配列aを持っていると言うと、a.shape(10,5,3)です。私はこれを形状の(10,5)の3面の感覚で使用しています。私はそのように見たいと思います。例えばNumPy配列を印刷するときの軸の順序

私は軸2を反復処理し、このように印刷する場合、私はそれをしたいように、それが表示されているのに対しI

print(a) 

は私が

[[[ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [ 0 22 0] 
    [11 22 33] 
    [ 0 0 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [ 0 0 0] 
    [11 22 33] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [ 0 0 0] 
    [11 22 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [11 0 0] 
    [11 22 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [ 0 22 0] 
    [11 0 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [ 0 0 0] 
    [11 22 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 33] 
    [ 0 0 0] 
    [11 22 33] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [11 22 0] 
    [ 0 22 33] 
    [11 22 0] 
    [ 0 0 0]] 

[[ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0] 
    [ 0 0 0]]] 

を取得する場合:

>>> for i in range(a.shape[2]): 
...  print(str(a[:,:,i]) + "\n") 
... 
[[ 0 0 0 0 0] 
[ 0 0 11 0 0] 
[ 0 11 0 11 0] 
[ 0 11 0 11 0] 
[ 0 11 11 11 0] 
[ 0 11 0 11 0] 
[ 0 11 0 11 0] 
[ 0 11 0 11 0] 
[ 0 11 0 11 0] 
[ 0 0 0 0 0]] 

[[ 0 0 0 0 0] 
[ 0 22 22 0 0] 
[ 0 22 0 22 0] 
[ 0 22 0 22 0] 
[ 0 22 0 22 0] 
[ 0 22 22 0 0] 
[ 0 22 0 22 0] 
[ 0 22 0 22 0] 
[ 0 22 22 22 0] 
[ 0 0 0 0 0]] 

[[ 0 0 0 0 0] 
[ 0 0 33 0 0] 
[ 0 33 0 33 0] 
[ 0 33 0 0 0] 
[ 0 33 0 0 0] 
[ 0 33 0 0 0] 
[ 0 33 0 0 0] 
[ 0 33 0 33 0] 
[ 0 0 33 0 0] 
[ 0 0 0 0 0]] 

これは私の心の中でもっと意味があります。

軸がどのように視覚化されるべきか私の直感のように思えますが、私の配列aは形状(3,5,10)でなければなりません。しかし、私はプロジェクト全体を特定のフォーマットの配列に回しているため、現時点では実際に変更することはできません。私は、軸の順序は任意であると考えています。そのため、私はこのように制限されています。 Axesを逆順に、または任意の順序で印刷するためにNumPyを使うことができます。私はnumpy.set_printoptionsのドキュメントをチェックして、何も見つからなかった。私は印刷は簡単だと思いますが、私は自分のデータをよく見なければならないすべてのスライシングを取りたいと思います。あるいは、誰かがなぜそれが完全に恣意的ではないのかを説明することができます。多分、配列の軸について別のやり方で考えるべきかもしれません。

+1

あなたがC対(グーグル)FORTRAN上に読んでください順序付けられた配列。配列がメモリ内でどのように機能するかをよりよく理解することができます。これにより、配列の取り扱い方法を理解するのに役立ちます。 Numpyは両方の注文をサポートしていますが、Cスタイルの注文のデフォルトをサポートしています。 – Aaron

+2

@Aaron残念なことに、fortranとcの順序付けはメモリ内のレイアウト(連続する行または連続する列)を参照しますが、印刷時の表現は参照しません。 'np.asfortranarray'は内部メモリのレイアウトが異なっていても同じreprを与えます。 –

+1

@BradSolomon私はインメモリ表現を意図的に参照していました。それは直接質問に答えることはできませんでしたが、私は知識が有用であると信じています。内部表現についてもっと知ることは、私が望む表現を得るために、より複雑なスライスやデータの並べ替えを行う方法を理解する上で大いに助けになりました。 – Aaron

答えて

1

残念ながら、これはNumPysの印刷オプションの簡単なスイッチではできません。実際には、希望の出力を得るために軸を並べ替える必要があります(これはかなり簡単です)。

それはprint INGのためだけなら、あなたは、単に印刷機能の周りに薄いラッパーを定義することができます。

import numpy as np 

def my_numpy_print(arr): 
    if arr.ndim == 3: 
     print(arr.transpose(2, 0, 1)) 
    else: # no idea how you want it to be displayed for different dimensional arrays. 
     print(arr) 

arr = ... 
my_numpy_print(arr) 

出力:

 
[[[ 0 0 0 0 0] 
    [ 0 0 11 0 0] 
    [ 0 11 0 11 0] 
    [ 0 11 0 11 0] 
    [ 0 11 11 11 0] 
    [ 0 11 0 11 0] 
    [ 0 11 0 11 0] 
    [ 0 11 0 11 0] 
    [ 0 11 0 11 0] 
    [ 0 0 0 0 0]] 

[[ 0 0 0 0 0] 
    [ 0 22 22 0 0] 
    [ 0 22 0 22 0] 
    [ 0 22 0 22 0] 
    [ 0 22 0 22 0] 
    [ 0 22 22 0 0] 
    [ 0 22 0 22 0] 
    [ 0 22 0 22 0] 
    [ 0 22 22 22 0] 
    [ 0 0 0 0 0]] 

[[ 0 0 0 0 0] 
    [ 0 0 33 0 0] 
    [ 0 33 0 33 0] 
    [ 0 33 0 0 0] 
    [ 0 33 0 0 0] 
    [ 0 33 0 0 0] 
    [ 0 33 0 0 0] 
    [ 0 33 0 33 0] 
    [ 0 0 33 0 0] 
    [ 0 0 0 0 0]]] 
1

MATLAB/Octaveは、必要に応じて行列を表示します。最初の軸は最も遅く、最後の軸は最も遅く変化します。

numpyは、他の順序で軸を反復します。最後の軸は最も速く変化します。連続した番号からの配列が違いを視覚化に役立つかもしれない作り

>> x = 1:24; 
>> x=reshape(x,2,3,4) 
x = 
ans(:,:,1) = 
    1 3 5 
    2 4 6 
ans(:,:,2) = 
    7 9 11 
    8 10 12 
ans(:,:,3) = 
    13 15 17 
    14 16 18 
ans(:,:,4) = 
    19 21 23 
    20 22 24 

In [82]: x = np.arange(1,25).reshape(2,3,4) 
In [83]: x 
Out[83]: 
array([[[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12]], 

     [[13, 14, 15, 16], 
     [17, 18, 19, 20], 
     [21, 22, 23, 24]]]) 

だからMATLAB順序は両方の反復および表示のために、(行、列、平面)です。 numpyは(面、行、列)です。 numpy

が、そこに、別の変数ですorder

In [85]: x = np.arange(1,25).reshape(2,3,4,order='F') 
In [86]: x 
Out[86]: 
array([[[ 1, 7, 13, 19], 
     [ 3, 9, 15, 21], 
     [ 5, 11, 17, 23]], 

     [[ 2, 8, 14, 20], 
     [ 4, 10, 16, 22], 
     [ 6, 12, 18, 24]]]) 

しかし、印刷は、まだ左から右に行きます。

In [115]: for i in range(4): print(x[:,:,i]) 
[[1 3 5] 
[2 4 6]] 
[[ 7 9 11] 
[ 8 10 12]] 
[[13 15 17] 
[14 16 18]] 
[[19 21 23] 
[20 22 24]] 

順序を視覚化する別の方法は、次の1つの列からのステップにstrides

In [119]: x = np.arange(1,25).reshape(2,3,4) 
In [120]: x.strides 
Out[120]: (48, 16, 4) 

を見ている、それは4つのバイトを移動します。しかし、ある飛行機から次の飛行機へは、48バイト(4 * 3 * 4)のストライドがあります。

order Fでは、ストライドは他の順序で増加します。

In [121]: np.arange(1,25).reshape(2,3,4,order='F').strides 
Out[121]: (4, 8, 24) 

私は私達の軸の順序を制御を与えるnp.set_printoptionsには何も表示されません。私はこの印刷がどこに定義されていないのですか。

関連する問題