1

文字列で構成される配列を、浮動小数点値と文字列を含む配列に変換しようとしています。私のコードは現在次のようになっています。

datatype1=np.dtype([
('LOCATION_THETA',np.float64),
('LOCATION_PHI',np.float64),
('ETHETA_MAGN',np.float64),
('ETHETA_PHASE',np.float64),
('EPHI_MAGN',np.float64),
('EPHI_PHASE',np.float64),
('DIRECTIVITY_VERT',np.float64),
('DIRECTIVITY_HORIZ',np.float64),
('DIRECTIVITY_TOTAL',np.float64),
('POLARISATION_AXIALR',np.float64),
('POLARISATION_ANGLE',np.float64),
('POLARISATION_DIRECTION','|S5')])

table2=np.array(table,dtype=datatype1)

( tablenumpy 配列の文字列) は次のようになります。

[['0.00' '0.00' '5.751E-01' '-2.08' '9.532E-05' '-86.19' '1.7442' '-73.8670' '1.7442' '0.0002' '0.00' 'RIGHT']
 ['2.00' '0.00' '5.747E-01' '-2.11' '1.291E-04' '-82.47' '1.7390' '-71.2312' '1.7390' '0.0002' '0.00' 'RIGHT']
 ['4.00' '0.00' '5.738E-01' '-2.21' '1.632E-04' '-80.31' '1.7243' '-69.1973' '1.7243' '0.0003' '0.00' 'RIGHT']
 ['6.00' '0.00' '5.722E-01' '-2.38' '1.973E-04' '-78.94' '1.7001' '-67.5479' '1.7001' '0.0003' '0.00' 'RIGHT']
 ['8.00' '0.00' '5.699E-01' '-2.61' '2.314E-04' '-78.02' '1.6663' '-66.1644' '1.6663' '0.0004' '0.01' 'RIGHT']
...

ただし、スクリプトを実行すると、次のエラーが発生します。

ValueError: could not convert string to float: RIGHT

文字列を...|S5ではなくにしたいので、これはすべきではありません。float

よろしくお願いします。

4

1 に答える 1

1

ここで何が起こるかというと、次のようになります。

ts = np.array(t, dtype=dt)

の各要素に dtype が適用されていtableます。最初の 11 個の要素に対しては正常に機能し、次に'RIGHT'整数にできない要素を取得します。なしで行うことは次の'RIGHT'とおりです(これは面倒です!):

>>> t[:2,:-1]
array([['0.00', '0.00', '5.751E-01', '-2.08', '9.532E-05', '-86.19', '1.7442', '-73.8670', '1.7442', '0.0002', '0.00'],
       ['2.00', '0.00', '5.747E-01', '-2.11', '1.291E-04', '-82.47', '1.7390', '-71.2312', '1.7390', '0.0002', '0.00']], 
      dtype='|S9')

>>> np.array(t[:2,:-1], dt)
array([[(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, '0.00'),
        (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, '0.00'),
        (0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, 0.5751, '5.751'),
        (-2.08, -2.08, -2.08, -2.08, -2.08, -2.08, -2.08, -2.08, -2.08, -2.08, -2.08, '-2.08'),
        (9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, 9.532e-05, '9.532'),
        (-86.19, -86.19, -86.19, -86.19, -86.19, -86.19, -86.19, -86.19, -86.19, -86.19, -86.19, '-86.1'),
        (1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, '1.744'),
        (-73.867, -73.867, -73.867, -73.867, -73.867, -73.867, -73.867, -73.867, -73.867, -73.867, -73.867, '-73.8'),
        (1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, 1.7442, '1.744'),
        (0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, '0.000'),
        (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, '0.00')],
       [(2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, '2.00'),
        (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, '0.00'),
        (0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, 0.5747, '5.747'),
        (-2.11, -2.11, -2.11, -2.11, -2.11, -2.11, -2.11, -2.11, -2.11, -2.11, -2.11, '-2.11'),
        (0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, 0.0001291, '1.291'),
        (-82.47, -82.47, -82.47, -82.47, -82.47, -82.47, -82.47, -82.47, -82.47, -82.47, -82.47, '-82.4'),
        (1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, '1.739'),
        (-71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, -71.2312, '-71.2'),
        (1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, 1.739, '1.739'),
        (0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, 0.0002, '0.000'),
        (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, '0.00')]], 
      dtype=[('LOCATION_THETA', '<f8'), ('LOCATION_PHI', '<f8'), ('ETHETA_MAGN', '<f8'), ('ETHETA_PHASE', '<f8'), ('EPHI_MAGN', '<f8'), ('EPHI_PHASE', '<f8'), ('DIRECTIVITY_VERT', '<f8'), ('DIRECTIVITY_HORIZ', '<f8'), ('DIRECTIVITY_TOTAL', '<f8'), ('POLARISATION_AXIALR', '<f8'), ('POLARISATION_ANGLE', '<f8'), ('POLARISATION_DIRECTION', 'S5')])

したがって、要素ごとに dtype を使用して素敵な小さなタプル (「レコード」) を取得することがわかりますdatatype1(最後のタプルも文字列になります)。

これにはいくつかの方法があります。最善の方法は、最初から適切な dtype を使用して配列を作成/インポートし、コピーする必要がないようにすることです。一部の変換では、データを新しい複雑な dtype を持っているかのようviewに単純に解釈することができますが、これは文字列を数値に変換しません。これは、データが数値であると偽るよりも複雑であるためです。

あなたの場合、おそらく通常の構造化配列recarrayよりも少し複雑な a を使用する必要があります。その後、関数を使用できます。行ではなく、それぞれが均一なタイプの列のリストを期待しているため、転置します。fromarrays

>>> np.rec.fromarrays(t.T, dt)
rec.array([ (0.0, 0.0, 0.5751, -2.08, 9.532e-05, -86.19, 1.7442, -73.867, 1.7442, 0.0002, 0.0, 'RIGHT'),
       (2.0, 0.0, 0.5747, -2.11, 0.0001291, -82.47, 1.739, -71.2312, 1.739, 0.0002, 0.0, 'RIGHT'),
       (4.0, 0.0, 0.5738, -2.21, 0.0001632, -80.31, 1.7243, -69.1973, 1.7243, 0.0003, 0.0, 'RIGHT'),
       (6.0, 0.0, 0.5722, -2.38, 0.0001973, -78.94, 1.7001, -67.5479, 1.7001, 0.0003, 0.0, 'RIGHT'),
       (8.0, 0.0, 0.5699, -2.61, 0.0002314, -78.02, 1.6663, -66.1644, 1.6663, 0.0004, 0.01, 'RIGHT')], 
      dtype=[('LOCATION_THETA', '<f8'), ('LOCATION_PHI', '<f8'), ('ETHETA_MAGN', '<f8'), ('ETHETA_PHASE', '<f8'), ('EPHI_MAGN', '<f8'), ('EPHI_PHASE', '<f8'), ('DIRECTIVITY_VERT', '<f8'), ('DIRECTIVITY_HORIZ', '<f8'), ('DIRECTIVITY_TOTAL', '<f8'), ('POLARISATION_AXIALR', '<f8'), ('POLARISATION_ANGLE', '<f8'), ('POLARISATION_DIRECTION', 'S5')])

素晴らしい!でも待って、今はこうなってるrec.arrayこのままでいいならいい。通常の構造化配列にしたい場合は、次のようにします。

>>> np.asarray(np.rec.fromarrays(t.T, dt))
于 2013-09-25T15:06:46.997 に答える