にありがとう、np.array
object 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
最初のケースでは、データ型オブジェクト(配列に格納されているアイテムはPythonリスト)を使用した1次元配列が作成されました。したがって、形状。私が指定を誤解していない限り、それはNumpyの視点からの均質な配列です(オブジェクトを見たり、オブジェクトが何であるか、または内部にあるかを気にしないので)。 – blubberdiblub
numpy 1.13では、これはより明白になり、配列は 'array([list([1,2,3])、list([4,5,9,8])))' – Eric
@blubberdiblub私は均質な部分を得る。それは私に興味をそそられた非均質な部分でした。コメントありがとうございました – 0Nicholas