29

さまざまな種類のデータがあります。それらのほとんどはint、時にはfloat. はintサイズが異なるため、8/16/32 ビットがサイズです。
この状況では、数値型コンバーターを作成しています。したがって、を使用してタイプを確認しisinstence()ます。これは、私が読んだことがあるからisinstance()ですtype()

ポイントは、取得するデータの多くがnumpy配列であるということです。私はspyderをIDEとして使用し、変数からタイプも確認します。しかし、入力isinstance(var,'type i read')するとFalse.

私はいくつかのチェックをしました:

a = 2.17 
b = 3 
c = np.array(np.random.rand(2, 8))
d = np.array([1])

そこでisinstance(var,type)私は得る:

isinstance(a, float)
True
isinstance(b, int)
True
isinstance(c, float)  # or isinstance(c, np.float64)
False
isinstance(d, int)  # or isinstance(c, np.int32)
False

cそしてd、私が尋ねるとTrueです

isinstance(c, np.ndarray)
True
isinstance(d, np.ndarray)
True

ステップインザndarrayバイで確認できます

isinstance(c[i][j], np.float64)
True
isinstance(d[i], np.int32)
True

しかし、これは、すべての次元に対して新しいインデックスを追加する必要があることを意味しFalseます。dtypeのようなタイプを確認できc.dtype == 'float64'ます...

私が見つけて試したことについてはわかりました...私の質問は基本的に次のとおりです。

  • この方法は、(最悪/より良いなど)とvar.dtype比較してどうですか?isinstance()type()
  • すべての手動インデックス作成なしで何らかの方法があるので、var.dtypeさらに悪い場合は? (自動索引付けなど)?isinstance()isinstance()
4

5 に答える 5

36

配列は 型のオブジェクトですnp.ndarray。その値または要素は、メモリ バイトの連続したブロックと考えることができるデータ バッファーに格納されます。データ バッファー内のバイトは Python オブジェクトではないため、型がありません。

配列には、dtypeこれらのバイトを解釈するために使用されるパラメーターがあります。dtypeである場合int32(さまざまな同義語があります)、4 バイトが整数として解釈されます。要素にアクセスするとc[0]、たとえば object type などの dtype に依存する新しいオブジェクトが得られますnp.int32

c[0].item対応するタイプの Python オブジェクトを返します。

In [2102]: c=np.array([1])
In [2103]: c.dtype
Out[2103]: dtype('int32')
In [2104]: type(c)
Out[2104]: numpy.ndarray
In [2105]: type(c[0])
Out[2105]: numpy.int32
In [2107]: c[0].item()
Out[2107]: 1
In [2108]: type(c[0].item())
Out[2108]: int

(またc[0].dtype、 の場合と同じですc.dtype。配列の個々の要素にインデックスを付けて、dtype をチェックする必要はありません)。

dtype int8この配列の同じ 4 バイトは、1 バイト整数と見なすことができます。

In [2112]: c.view('b')
Out[2112]: array([1, 0, 0, 0], dtype=int8)

この代替ビューの 1 つの要素は ですnp.int8item()、 を取得すると Python 整数が得られます。int8Python 数値型はありません。

In [2113]: type(c.view('b')[0])
Out[2113]: numpy.int8
In [2115]: type(c.view('b')[0].item())
Out[2115]: int

リストには Python オブジェクトへのポインターが含まれており、それぞれに型があります。の配列も同様ですdtype=object。しかし、一般的な数値配列には Python の整数や浮動小数点数は含まれていません。に従ってさまざまな方法で解釈できるデータ バッファーがありますdtype。Python 整数は、少なくとも numpy dtypes と同じ程度ではなく、異なるサイズにはなりません。

したがって、isinstanceandtype()の内容は an の内容には適用されませんndarray

====================

私が収集したコメントから、整数配列を浮動小数点数に変換しようとしています。スカラーを変換していません。もしそうなら、それdtypeがすべてです。配列には常にdtype. np.float32aを toにキャストしても問題ないかどうかは不明ですnp.float64

np.can_cast関数とx.astypeメソッド を調べて実験することをお勧めします。

x.astype(np.float64, copy=False)

たとえば、すでに float64 になっているものをコピーせずに、すべての int dtype を float に変換します。コピーして変換する場合がありますnp.float32

castingこれらの関数のパラメーターも見てください。

===========================

scipy.optimize.minimize別のテストツールで見つけた

In [156]: np.typecodes
Out[156]: 
{'All': '?bhilqpBHILQPefdgFDGSUVOMm',
 'AllFloat': 'efdgFDG',
 'AllInteger': 'bBhHiIlLqQpP',
 'Character': 'c',
 'Complex': 'FDG',
 'Datetime': 'Mm',
 'Float': 'efdg',
 'Integer': 'bhilqp',
 'UnsignedInteger': 'BHILQP'}

次のように整数をチェックするために使用できます。

if x0.dtype.kind in np.typecodes["AllInteger"]:
    x0 = np.asarray(x0, dtype=float)
于 2016-10-28T20:41:41.257 に答える
1

numpy 配列内のすべてのエントリは同じ型です。numpy 型と Python 型は同じものではありません。これは少し紛らわしいかもしれませんが、numpy が参照する型は、C などの言語で使用される型に似ています。より低レベルでマシンに近いと言えます。

リンゴとミカンを比較するようなものなので、どちらが良いとは言えません。

于 2016-10-28T19:42:48.433 に答える