さまざまな種類のデータがあります。それらのほとんどは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
になります。 c.dtype == 'float64'
..のようにdtype
でタイプを確認できます。
私が見つけて試したことについてはそうです...私の質問は基本的に:
var.dtype
メソッドはisinstance()
およびtype()
と比較してどうですか(最悪/より良いなど)?var.dtype
がisinstance()
のようにさらに悪い場合、isinstance()
にすべての手動インデックスなしのメソッドがありますか? (自動インデックス作成など)?配列はタイプnp.ndarray
のオブジェクトです。その値または要素はデータバッファに格納されます。データバッファは、メモリバイトの連続したブロックと考えることができます。データバッファ内のバイトは、Pythonオブジェクトではないため、型はありません。
配列には、これらのバイトを解釈するために使用されるdtype
パラメーターがあります。 dtype
がint32
(さまざまな同義語があります)の場合、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].dtype
はc.dtype
の場合と同じです。dtypeをチェックするために配列の個々の要素にインデックスを付ける必要はありません)。
この配列の同じ4バイトは、dtype
int8
-単一バイト整数と見なすことができます。
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.float32
をnp.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)
質問に直接答えるには、次のようにします。
isinstance(arr.flat[0], np.floating)
.flat
は任意の数の次元を折りたたむので、0番目の要素に簡単にアクセスできます。np.floating
任意のnumpyfloatタイプに一致しますNumpy配列のすべてのエントリは同じタイプです。 numpy型とPython型は同じものではありません。これは少し混乱する可能性がありますが、numpyが参照する型は、Cなどの言語で使用される型に似ています-もっと言うかもしれません低レベルでマシンに近づきます。
Appleとオレンジを比較するようなものなので、どちらのタイプが良いかはわかりません。