2017-05-09 7 views
0

Pythonコースでは、私はあなたの助けを借りたいと思います。配列データ型を変換してチェックする

imputとして配列とデータ型の2つのパラメータをとる関数check_conversionを定義します。この関数は、初期配列内のすべての要素が無損失で特定のデータ型に変換できるかどうかを示すブール値を返す必要があります。

私はこのコードを持っていますが、すべての入力でTrueを返します。私たちはnumpyライブラリしか使えないので、これは制約です。 私はこれを恐れているでしょうし、はるかに簡単な解決策があります。

import numpy 
def check_conversion(x, d_type): 


x = numpy.array([x], dtype= d_type) 
dtype = "" 

x_float32 = x.astype('float32') 
x_float64 = x.astype('float64') 
x_int = x.astype('int') 
x_un_int64 = x.astype('uint64') 

print(x, x.dtype) 
print(x_int, x_int.astype) 
print(x_float32, x_float32.dtype) 


if numpy.all(x) == numpy.all(x_float32): 
    return True 


elif numpy.all(x) == numpy.all(x_float64): 
    return True 


elif numpy.all(x) == numpy.all(x_int): 
    return True 


elif numpy.all(x) == numpy.all(x_un_int64): 
    return True 

else: 
    return False 

a = numpy.array([3., 3.2, 1]) 
data_type_a = "int" 
print(check_conversion(a, data_type_a)) 
b = numpy.array([3., 3.2, -1]) 
data_type_b = "float32" 
print(check_conversion(b, data_type_b)) 
c = numpy.array([3., 3.2, -1]) 
data_type_c = "float64" 
print(check_conversion(c, data_type_c)) 
d = numpy.array([3, 2, -1]) 
data_type_d = "uint64" 
print(check_conversion(d, data_type_d)) 

ありがとうございます!

+0

字下げを修正できますか? – Nuageux

+0

こんにちは、 'np.all'がどのように動作しているのか誤解していると思います。配列のすべての要素がTrueおよびFalseの場合はTrueを返します。ここで、「0」と「0.0」は「False」とみなされ、他のすべての数字は「True」とみなされます。あなたの比較は、両方の配列にゼロが入っているかどうかだけをチェックします。条件を 'numpy.all(x == x_float32)'に変更する必要があります。また、関数呼び出しで与えられたデータ型だけをチェックしたいだけです。 Atmではfloat32だけをチェックし、それが有効であれば 'True'を返し、elsewayを続行します。 – jotasi

答えて

0

これはあなたに合っていますか?

import numpy 

def check_conversion(x, d_type): 
    xb = numpy.array(x, dtype= d_type) 
    print x, xb 
    if numpy.array_equal(x, xb): 
     return d_type, True 
    return d_type, False 

a = numpy.array([3., 3.2, 1]) 
data_type_a = "int" 
print(check_conversion(a, data_type_a)) 
b = numpy.array([3., 3.2, -1]) 
data_type_b = "float32" 
print(check_conversion(b, data_type_b)) 
c = numpy.array([3., 3.2, -1]) 
data_type_c = "float64" 
print(check_conversion(c, data_type_c)) 
d = numpy.array([3, 2, -1]) 
data_type_d = "uint64" 
print(check_conversion(d, data_type_d)) 

出力

[ 3. 3.2 1. ] [3 3 1] 
('int', False) 
[ 3. 3.2 -1. ] [ 3.   3.20000005 -1.  ] 
('float32', False) 
[ 3. 3.2 -1. ] [ 3. 3.2 -1. ] 
('float64', True) 
[ 3 2 -1] [     3     2 18446744073709551615] 
('uint64', False) 

私はnumpy.array_equal functionで、前xに比較していますより新しいxb配列を作成しています。

+0

@Naugeuxありがとう!スタックオーバーフローは素晴らしいです。決してそのような迅速な返信はありませんでした – gerlof92

+0

クイック返信は問題に依存しています; – Nuageux

関連する問題