2017-10-26 12 views
0

numpy配列の要素のdtypeを変更すると、配列の形状が変わるのはなぜですか?私はnumpyに慣れず、dtypeを既存のnp.int32からnp.float16に変更しようとしていました。これにより配列の形が変わりましたが、np.float32に変更しても形状は変更されません。dtypeを変更するとNumpy配列の形状が変化する

>>> import numpy as np 
>>> arr1=np.array([1,2,3,4] 
>>> arr1 
array([1, 2, 3, 4]) 
>>> arr1.shape 
(4,) 
>>> arr1.dtype=np.float16 
>>> arr1 
array([ 5.96046448e-08, 0.00000000e+00, 1.19209290e-07, 
    0.00000000e+00, 1.78813934e-07, 0.00000000e+00, 
    2.38418579e-07, 0.00000000e+00], dtype=float16) 
>>> arr1.shape 
(8,) 

答えて

1

配列のデータ型を変更すると、実際に格納されているバイトの意味と、どれだけ多くの値が1つの値を構成するのかが変わるためです。 あなたの最初の配列は、おそらく4つの値のそれぞれは、4バイトで構成され、したがって、データ型int32があります

a = np.array([1, 2, 3, 4], dtype=np.int32) 
a 
>>> array([1, 2, 3, 4], dtype=int32) 
bytes(a) 
>>> b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00' 

は、データ型が格納されたバイトを変更しない変更が、ちょうど彼らが何を意味するか:

a.dtype = np.float16 
bytes(a) 
>>> b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00' 
a 
>>> array([ 5.96046448e-08, 0.00000000e+00, 1.19209290e-07, 
    0.00000000e+00, 1.78813934e-07, 0.00000000e+00, 
    2.38418579e-07, 0.00000000e+00], dtype=float16) 

実際.astypeを使用し、値を変換するには:

a.astype(np.float32) 
>>> array([ 1., 2., 3., 4.], dtype=float32) 
0

アレイのdtypeを変更するには、atrtibute dtypeを使用しないでください。また、元の数字と比較して新しい数字が意味をなさないこともわかります。

代わりにarr1.astype(np.float16)を使用してください。

私の推測では、dtypeをdiretlyに変更するだけでnumpyに各要素の読み込み量を変更するように指示していると思います。したがって、メモリ表現の半分であるfloat32からfloat16に減らすので、サイズは2倍になります。

0

あなたがのデータ型を変更したい場合配列の場合は、arr1.astype(np.float16)を実行する必要があります。

私はこれについて完全にはわかりませんが、numpyは配列のメモリ使用量をデータ型のサイズで割って形状を計算していると思います。

dtypeを直接変更すると、配列の要素のサイズが同じであると考えられるため、別の回答が得られる可能性があります。

関連する問題