2017-07-13 11 views
-1

配列がどのように決定されているかを理解するのが難しいです。フォームのいずれndarrayの形状を理解する

[[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4]] 

ながら形

[[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4,3]] 

のアレイ(2)の形状を有している(2,3)の形状を有しています。また、

[[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [[1,2,4], [3,4,2]]] 

(2)の形状を有するが、

[[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [[1,2,4], [3,4,2], [1,2,4]]] 

ような他のベクターを添加することは、(2,3,3)に形状を変化させます。直観的に、私はすべての配列が3次元であるべきだと感じます。誰が私に何が起こっているのかを理解するのを助けることができますか?

+4

ようです。 – Divakar

+0

numpy 1.13.xにアップグレードすると、これらのオブジェクト配列は紛らわしく印刷されません – Eric

+1

'numpy'は真の多次元配列のみをサポートしません。したがって、コンストラクタがサブリストがギザギザの配列を生成することを検出すると、Pythonオブジェクトの1次元配列を作成します。 –

答えて

3

np.arrayは可能な限り高次元の配列を作成しようとしています。サブリストに一致する数の要素がある場合、結果は見やすくなります。異なる長さのリストを混在させると、結果が混乱する可能性があります。あなたの最初のケースで

あなたは2つのサブリスト、長さ3の1、だから、2要素オブジェクトの配列を行い、第一サブリストのサブリストを解析しようとしません。4.その他の長さを持っている

In [1]: arr = np.array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4,3]]) 
In [2]: arr 
Out[2]: array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], 
       [1, 2, 4, 3] 
       ], dtype=object) # adjusted format 
In [3]: arr.dtype 
Out[3]: dtype('O') 
In [4]: arr.shape 
Out[4]: (2,) 
In [5]: arr[0] 
Out[5]: [[5, 10, 15], [20, 25, 30], [35, 40, 45]] # 3 element list of lists 
In [6]: arr[1] 
Out[6]: [1, 2, 4, 3] # 4 element list of numbers 

2番目のケースでは、長さ3の2つのサブリストがあります。したがって、2x3配列になります。

In [7]: arr = np.array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4]]) 
In [8]: arr 
Out[8]: 
array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], 
     [1, 2, 4] 
     ], dtype=object) 
In [9]: arr.shape 
Out[9]: (2, 3) 
In [10]: arr[0,0] 
Out[10]: [5, 10, 15] 

最後に、2つのリスト、また、3つの要素リストでそれぞれが3つの要素、各 - 3Dアレイ:結果は再び配列オブジェクトであるように - しかし、一つのサブリストは、リスト、他の数字を含んでいます。

In [11]: arr = np.array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [[1,2,4], [3,4,2], [1,2,4]]]) 
In [12]: arr 
Out[12]: 
array([[[ 5, 10, 15], 
     [20, 25, 30], 
     [35, 40, 45]], 

     [[ 1, 2, 4], 
     [ 3, 4, 2], 
     [ 1, 2, 4]]]) 
In [13]: arr.shape 
Out[13]: (2, 3, 3) 

エラーを発生させる可能性のあるサブリストの長さが混在しています。

一般に、異なるサイズとコンテンツタイプのサブリストを簡単に混在させないでください。 np.arrayは、素敵な多次元配列を生成する与えられたリストが最も予測可能に動作します。リストの長さを混ぜると、混乱することになります。


更新numpyの:

In [1]: np.__version__ 
Out[1]: '1.13.1' 
In [2]: np.array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4,3]]) 
Out[2]: array([list([[5, 10, 15], [20, 25, 30], [35, 40, 45]]), list([1, 2, 4, 3])], dtype=object) 

In [3]: np.array([[[5, 10, 15], [20, 25, 30], [35, 40, 45]], [1,2,4]]) 
Out[3]: 
array([[list([5, 10, 15]), list([20, 25, 30]), list([35, 40, 45])], 
     [1, 2, 4]], dtype=object) 

を今この最後の例では、依然として(2,3)オブジェクト配列であるlist要素

を識別する。あなたは、変数ごと*サブリスト*の要素数、オブジェクトDTYPEとの配列を強制的に、定期的な*いない* 1を持っているので、これらの6つの要素のように、それぞれ例えば、異なるPythonのタイプかもしれない:

In [11]: np.array([[[5, 10, 15], np.array([20, 25, 30]), (35, 40, 45)], [None,2,'astr']]) 
Out[11]: 
array([[list([5, 10, 15]), array([20, 25, 30]), (35, 40, 45)], 
     [None, 2, 'astr']], dtype=object) 
In [12]: [type(x) for x in _.flat] 
Out[12]: [list, numpy.ndarray, tuple, NoneType, int, str] 
関連する問題