2017-05-02 3 views
0

最近numpyを開始し、特有のものに気付きました。非同質のnumpy配列を理解する

import numpy as np 
a = np.array([[1,2,3], [4,5,9, 8]]) 
print a.shape, "shape" 
print a[1, 0] 

形状は、この場合には、2Lように出てきます。しかし、私が a = np.array([[1,2,3], [4,5,6]]と同数の配列を作ると、a.shape(2L, 3L)となります。非均質配列の形状はタプルとして表現するのが難しいことを理解しています。

さらに、私が以前に作成した非同種アレイのprint a[1,0]は、トレースバックIndexError: too many indices for arrayを与えます。均質な配列で同じことを行うと、正しい要素4が返されます。

これらの2つの特徴に気付くと、私はPythonが低レベルで非均質な魔法の配列をどのように見ているのか興味があります。サブリストの長さが異なる場合 は事前

+1

最初のケースでは、データ型オブジェクト(配列に格納されているアイテムはPythonリスト)を使用した1次元配列が作成されました。したがって、形状。私が指定を誤解していない限り、それはNumpyの視点からの均質な配列です(オブジェクトを見たり、オブジェクトが何であるか、または内部にあるかを気にしないので)。 – blubberdiblub

+0

numpy 1.13では、これはより明白になり、配列は 'array([list([1,2,3])、list([4,5,9,8])))' – Eric

+0

@blubberdiblub私は均質な部分を得る。それは私に興味をそそられた非均質な部分でした。コメントありがとうございました – 0Nicholas

答えて

3

にありがとう、np.arrayobject dtype配列を作成にフォールバック:

In [272]: a = np.array([[1,2,3], [4,5,9, 8]]) 
In [273]: a 
Out[273]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object) 

この配列は、使い始めたリストに似ています。両方ともポインタとしてサブリストを格納します。サブリストは他の場所に存在し、メモリ内に存在します。同じ長さのsublstsで

、それは整数要素で、2次元配列を作成することができます実際には

In [274]: a2 = np.array([[1,2,3], [4,5,9]]) 
In [275]: a2 
Out[275]: 
array([[1, 2, 3], 
     [4, 5, 9]]) 

をサブリストは、メモリ内の他の場所に保存されているというのが私の主張を確認するために、のいずれかを変更してみましょう:

In [276]: alist = [[1,2,3], [4,5,9, 8]] 
In [277]: a = np.array(alist) 
In [278]: a 
Out[278]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object) 
In [279]: a[0].append(4) 
In [280]: a 
Out[280]: array([[1, 2, 3, 4], [4, 5, 9, 8]], dtype=object) 
In [281]: alist 
Out[281]: [[1, 2, 3, 4], [4, 5, 9, 8]] 

a2の場合は動作しません。 a2には、ソースリストとは独立した独自のデータストレージがあります。

np.arrayは可能であればn-dアレイを作成しようとしています。できない場合は、オブジェクトdtype配列を作成することに戻ります。そして、他の質問で議論されているように、時にはエラーを起こすことがあります。意図的にオブジェクト配列を作成することも難しいです。

aの形状は簡単ですが、(2、)。単一要素タプル。 aは1d配列です。しかしその形はaの要素に関する情報を伝えません。そして、同じことがalistの要素にも当てはまります。 len(alist)は2です。オブジェクト配列は、より複雑な形状を持つことができます。 a.reshape(1,2,1)ですが、まだポインタだけを含んでいます

aには2つの4バイトポインタが含まれています。 a2には6つの4バイト整数が含まれます。

n [282]: a.itemsize 
Out[282]: 4 
In [283]: a.nbytes 
Out[283]: 8 
In [284]: a2.nbytes 
Out[284]: 24 
In [285]: a2.itemsize 
Out[285]: 4 
+0

ありがとうございます。それは多くの意味があります。 – 0Nicholas

関連する問題