web-dev-qa-db-ja.com

numpy配列内のタイプを確認してください

さまざまな種類のデータがあります。それらのほとんどは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

cdは私が尋ねると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になります。 c.dtype == 'float64' ..のようにdtypeでタイプを確認できます。

私が見つけて試したことについてはそうです...私の質問は基本的に:

  • var.dtypeメソッドはisinstance()およびtype()と比較してどうですか(最悪/より良いなど)?
  • var.dtypeisinstance()のようにさらに悪い場合、isinstance()にすべての手動インデックスなしのメソッドがありますか? (自動インデックス作成など)?
6
Jan-Bert

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

配列には、これらのバイトを解釈するために使用されるdtypeパラメーターがあります。 dtypeint32(さまざまな同義語があります)の場合、4バイトは整数として解釈されます。要素にアクセスすると、たとえばc[0]は、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].dtypec.dtypeの場合と同じです。dtypeをチェックするために配列の個々の要素にインデックスを付ける必要はありません)。

この配列の同じ4バイトは、dtypeint8-単一バイト整数と見なすことができます。

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

この代替ビューの単一の要素はnp.int8ですが、item()を取得すると、Python integer。int8 Python数値型。

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整数は含まれません。またはfloats。dtypeに従ってさまざまな方法で解釈できるデータバッファがあります。Python整数は、少なくとも同じ程度ではなく、異なるサイズにはなりません。 numpydtypesとして。

したがって、isinstanceおよびtype()のものはndarrayの内容には適用されません。

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

私が集めたコメントから、あなたは整数配列を浮動小数点数に変換しようとしています。スカラーを変換していません。もしそうなら、dtypeが重要です。配列には常にdtypeがあります。 np.float32np.float64にキャストしても大丈夫かどうかは不明です。

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

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

たとえば、すでにfloat64であるものをコピーせずに、すべてのintdtypeを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)
9
hpaulj

質問に直接答えるには、次のようにします。

isinstance(arr.flat[0], np.floating)

  • .flatは任意の数の次元を折りたたむので、0番目の要素に簡単にアクセスできます。
  • np.floating任意のnumpyfloatタイプに一致します
0
rasen58

Numpy配列のすべてのエントリは同じタイプです。 numpy型とPython型は同じものではありません。これは少し混乱する可能性がありますが、numpyが参照する型は、Cなどの言語で使用される型に似ています-もっと言うかもしれません低レベルでマシンに近づきます。

Appleとオレンジを比較するようなものなので、どちらのタイプが良いかはわかりません。

0
J. P. Petersen