2017-01-16 9 views
1

int配列からfloat32数値を減算しているようですが、デフォルトでfloat64配列になります。これを回避し、代わりに結果のデータ型としてfloat32を取得する方法はありますか?NumPyで算術演算の結果のデータ型を指定する方法は?

numpy.subtractでは、dtype引数を指定できません。

これを実現する唯一の方法は、int配列をfloat32に変換してから、2つのfloat32配列を効果的に減算することです。これはそうなるのでしょうか?

例コード:

import time 
import numpy as np 

if __name__ == '__main__': 

    # some int32 array 
    a = np.arange(1e7) 
    print('a.dtype={}'.format(a.dtype)) # int32 

    # subtraction with a python float 
    t0 = time.clock() 
    b = a - 5.5 
    t1 = time.clock() 
    print('b.dtype={}, took {}s'.format(b.dtype, t1 - t0)) # float64 

    # a numpy float32 
    c = np.array(5.5, dtype=np.float32) 
    print('c.dtype={}'.format(c.dtype)) # float32 

    # subtraction with the numpy float32 
    t0 = time.clock() 
    d = a - c 
    t1 = time.clock() 
    print('d.dtype={}, took {}s'.format(d.dtype, t1 - t0)) # float64! why not float32 

    # convert the int32 to float32 
    e = a.astype(dtype=np.float32) 
    print('e.dtype={}'.format(e.dtype)) # float32 

    # subtract two float32 array 
    t0 = time.clock() 
    e = a.astype(dtype=np.float32) 
    f = e - c 
    t1 = time.clock() 
    print('f.dtype={}, took {}s'.format(f.dtype, t1 - t0)) # float32 (finally) 

印刷前のfloat32自動のfloat64に変換するよりも遅いと思われるために手動で変換

a.dtype=float64 
b.dtype=float64, took 0.0229595559008s 
c.dtype=float32 
d.dtype=float64, took 0.0223958136306s 
e.dtype=float32 
f.dtype=float32, took 0.0334388477586s 

答えて

5

ufuncとして、np.subtractseveral keyword argumentsをメイン文書ページに表示しません。これらのうちの1つはdtypeなので、例えば:np.subtract(a, b, dtype='float32')とし、必要な結果を得ることができます。場合

それはnp.promote_typesはあなたに2 dtypes両方が安全にキャスト可能な最小のDTYPEを教えてくれます、将来的には便利です、とnp.result_typeはあなたにnumpyのの鋳造ルールは、デフォルトでは得られますDTYPEを教えてくれます。

+0

それは文字通り私の最初の考えだったし、私は最初にそれを試してみたと思った。しかし、私はしていないようだ。 promot_typesとresult_typeもありがとう。 – Trilarion