2016-07-01 35 views

答えて

9

違いを見る別の方法は、2種類のオブジェクトにどのような方法があるかを尋ねることです。

私は方法を見て、完全なタブを使用することができますIpythonで

In [1277]: x=123; y=np.int32(123) 

intメソッドと属性:

In [1278]: x.<tab> 
x.bit_length x.denominator x.imag   x.numerator x.to_bytes 
x.conjugate x.from_bytes x.real   

int「事業者の

In [1278]: x.__<tab> 
x.__abs__   x.__init__   x.__rlshift__ 
x.__add__   x.__int__   x.__rmod__ 
x.__and__   x.__invert__  x.__rmul__ 
x.__bool__   x.__le__   x.__ror__ 
... 
x.__gt__   x.__reduce_ex__  x.__xor__ 
x.__hash__   x.__repr__   
x.__index__   x.__rfloordiv__  

np.int32メソッドと属性を(またはプロパティ)。同じのいくつかが、より多くの、基本的にすべてのndarrayもの:

In [1278]: y.<tab> 
y.T    y.denominator y.ndim   y.size 
y.all   y.diagonal  y.newbyteorder y.sort 
y.any   y.dtype   y.nonzero  y.squeeze 
... 
y.cumsum  y.min   y.setflags  
y.data   y.nbytes  y.shape 

y.__方法はintもののような多くのことを見て。彼らは同じ数学をすることができます。

In [1278]: y.__<tab> 
y.__abs__    y.__getitem__   y.__reduce_ex__ 
y.__add__    y.__gt__    y.__repr__ 
... 
y.__format__   y.__rand__    y.__subclasshook__ 
y.__ge__    y.__rdivmod__   y.__truediv__ 
y.__getattribute__  y.__reduce__   y.__xor__ 

yは多くの点で0dアレイと同じです。同一ではないが近い。

In [1281]: z=np.array(123,dtype=np.int32) 

np.int32は私が得るものであるとき、I指数その型の配列:

In [1300]: A=np.array([0,123,3]) 

In [1301]: A[1] 
Out[1301]: 123 

In [1302]: type(A[1]) 
Out[1302]: numpy.int32 

私はnumpyラッピングのすべてを削除するためにitemを使用する必要があります。 numpyユーザ、np.int32numpyラッパーとintされているよう

In [1303]: type(A[1].item()) 
Out[1303]: int 

。逆に、ndarrayの1つの要素。通常、私はA[0]が私に 'ネイティブ' intかnumpyの同等物を与えているかどうかについては注意を払っていません。新しいユーザーとは対照的に、私はめったにnp.int32(123)を使用しません。代わりにnp.array(123)を使用します。

A = np.array([1,123,0], np.int32) 

は、3 np.int32オブジェクトを含まない。むしろそのデータバッファは3 * 4 = 12バイト長です。それは1dの3つの整数として解釈する配列オーバーヘッドです。そしてviewは私の解釈が異なると同じのDataBufferを示しています

In [1307]: A.view(np.int16) 
Out[1307]: array([ 1, 0, 123, 0, 0, 0], dtype=int16) 

In [1310]: A.view('S4') 
Out[1310]: array([b'\x01', b'{', b''], dtype='|S4') 

それはときにのみ、私は、インデックス、私はnp.int32オブジェクトを取得する単一の要素をです。

リストL=[1, 123, 0]は異なります。それはポインターのリストです - intオブジェクトへのポインタメモリ内のどこに。同様にdtype =オブジェクト配列。

-2

ない完全な答えが、これはあなたがhttp://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html

ブール値を表す5つの基本的な数値型(ブール値)がありますが、整数(int型)、符号なし整数(UINT)浮動小数点(フロート)と複合体を始める必要があります。名前の数字を有するものは、そのタイプのビットサイズ(すなわち、メモリ内の単一の値を表すために必要なビット数)を示す。 intやintpなどのいくつかの型は、プラットフォーム(例えば、32ビットマシンと64ビットマシン)によってビットサイズが異なります。これは、ロー・レベルのコード(CやFortranなど)とのインタフェイス時に考慮に入れて、ロー・メモリーがアドレス指定されている場合に考慮する必要があります。

+0

リンクのみの回答は低品質です。リンク内のトピックを詳しく説明してください。 – Li357

1

最も大きな違いは、numpyの種類がCの対応版と互換性があるということです。一つには、これはあなたが整数の配列を作成し、例えばnp.int32として、データ型を指定することができる理由です

>>> np.int32(2**32) 
0 

... numpyのint型がオーバーフローすることができますことを意味します。 Numpyは指定された数の32ビット整数を保持するのに十分な大きさの配列を割り当てます。値が必要なときはC整数をnp.int32に変換します(これは非常に速い)。 np.int32とC-intから前後に変換できるという利点には、メモリの節約も含まれます。 Pythonオブジェクトは、一般的にはかなり大きいです:

>>> sys.getsizeof(1) 
24 

np.int32がどの小さくない:

>>> sys.getsizeof(np.int32(1)) 
28 

しかし、我々はnumpyの配列で作業しているほとんどの時間を覚えて、私たちは取り組んでいますCの整数は4バイト(24ではなく)だけをとります。配列からスカラー値を扱うときは、np.int32で作業する必要があります。

7

いくつかの主な違いがあります。最初は、Pythonの整数は(少なくともPython 3.xでは)柔軟なサイズです。つまり、任意の数の任意のサイズに対応できるように成長することができます(もちろん、メモリの制約内で)。これに対してnumpyの整数は固定サイズです。これは、保持できる最大値があることを意味します。これは、整数(int32int64)のバイト数で定義され、より多くのバイトが大きい数字を保持し、数値が符号付きか符号なし(int32uint32)か、より大きい数字を保持できる負の数を保持することはできません。

なぜ、固定長整数を使用するのか尋ねることがありますか?その理由は、現代のプロセッサには、固定長の整数で数学を行うためのツールが組み込まれているため、それらの計算ははるかに高速です。実際、Pythonは、数値が小さすぎると固定長の整数を使用し、数値が大きすぎると柔軟性の低い整数に切り替えるだけです。

固定サイズの値のもう1つの利点は、同じタイプの一貫したサイズの隣接するメモリブロックに配置できることです。これは、データを格納するためにnumpy配列が使用する形式です。 numpyが依存するライブラリは、この形式のデータに対して非常に高速な計算を行うことができます。実際、最新のCPUには、この種の計算を高速化するための組み込みの機能があります。可変サイズのPython整数では、ブロックの大きさやデータ形式の一貫性がないと言うことができないため、このような計算は不可能です。

つまり、numpyは実際にはPython整数の配列を作ることができます。しかし、値を含む配列ではなく、実際のP​​ython整数を保持する他のメモリへの参照を含む配列です。これは同じ方法で加速することはできません。したがって、すべてのPython整数が固定の整数サイズに収まる場合でも、それはまだ加速されません。

これはPython 2の場合ではありません。Python 2では、Python整数は固定された整数であり、numpy整数に直接変換できます。可変長整数の場合、Python 2はlongの型を持っていました。しかし、これは混乱していました。この混乱は、特にパフォーマンスが必要な人たちが何となくそれを使用しているようなときに、パフォーマンスの向上に値するものではないと判断されました。

関連する問題