web-dev-qa-db-ja.com

構造化配列を通常のNumPy配列に変換

答えは明白だと思いますが、現時点ではわかりません。

レコード配列を通常のndarrayに変換するにはどうすればよいですか?

次の単純な構造化配列があるとします。

_x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[('f0', '<f8'), ('f1', '<f8')])
_

それから私はそれを次のように変換したいです:

_array([[ 1.,  4.],
       [ 2., -1.]])
_

asarrayastypeを試しましたが、うまくいきませんでした。

PDATE(解決:float64(f8)ではなくfloat32(f4))

OK、ロバート(x.view(np.float64).reshape(x.shape + (-1,)))の解決策を試しましたが、単純な配列で完全に機能します。しかし、配列を変換したいのですが、奇妙な結果が得られます。

_data = np.array([ (0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0),
       (0.014793682843446732, 0.006681123282760382, 0.0, 0.0, 0.0, 0.0008984912419691682, 0.0, 0.013475529849529266, 0.0, 0.0),
       (0.014776384457945824, 0.006656022742390633, 0.0, 0.0, 0.0, 0.0008901208057068288, 0.0, 0.013350814580917358, 0.0, 0.0),
       (0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.0012627150863409042, 0.0, 0.018906937912106514, 0.0, 0.0),
       (0.011928378604352474, 0.002819152781739831, 0.0, 0.0, 0.0, 0.001259754877537489, 0.0, 0.01886274479329586, 0.0, 0.0),
       (0.011969991959631443, 0.0028706740122288465, 0.0, 0.0, 0.0, 0.0007433745195157826, 0.0, 0.011164642870426178, 0.0, 0.0)], 
      dtype=[('a_soil', '<f4'), ('b_soil', '<f4'), ('Ea_V', '<f4'), ('Kcc', '<f4'), ('Koc', '<f4'), ('Lmax', '<f4'), ('malfarquhar', '<f4'), ('MRN', '<f4'), ('TCc', '<f4'), ('Vcmax_3', '<f4')])
_

その後:

_data_array = data.view(np.float).reshape(data.shape + (-1,))
_

与える:

_In [8]: data_array
Out[8]: 
array([[  2.28080997e-20,   0.00000000e+00,   2.78023241e-27,
          6.24133580e-18,   0.00000000e+00],
       [  2.28080997e-20,   0.00000000e+00,   2.78023241e-27,
          6.24133580e-18,   0.00000000e+00],
       [  2.21114197e-20,   0.00000000e+00,   2.55866881e-27,
          5.79825816e-18,   0.00000000e+00],
       [  2.04776835e-23,   0.00000000e+00,   3.47457730e-26,
          9.32782857e-17,   0.00000000e+00],
       [  2.04776835e-23,   0.00000000e+00,   3.41189244e-26,
          9.20222417e-17,   0.00000000e+00],
       [  2.32706550e-23,   0.00000000e+00,   4.76375305e-28,
          1.24257748e-18,   0.00000000e+00]])
_

wichは、他の数値と別の形状の配列です。何を間違えたのですか?

40
joris
[~]
|5> x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[('f0', '<f8'), ('f1', '<f8')])

[~]
|6> x.view(np.float64).reshape(x.shape + (-1,))
array([[ 1.,  4.],
       [ 2., -1.]])
26
Robert Kern

最も簡単な方法はおそらく

_x.view((float, len(x.dtype.names)))
_

floatは通常、x:_x.dtype[0]_の要素のタイプで置き換える必要があります)。これは、すべての要素が同じタイプであることを前提としています。

このメソッドは、単一のステップで通常の_numpy.ndarray_バージョンを提供します(view(…).reshape(…)メソッドで必要な2つのステップとは異なります)。

36
Eric O Lebigot
np.array(x.tolist())
array([[ 1.,  4.],
      [ 2., -1.]])

しかし、もっと良い方法があるかもしれません...

9
Andrea Zonca

マルチフィールドインデックスの処理方法の変更に関連して、numpyには、構造化配列との変換に役立つ2つの新しい関数が用意されています。

numpy.lib.recfunctions、 これらは structured_to_unstructuredおよびunstructured_to_structuredrepack_fieldsは別の新しい関数です。

から 1.16 リリースノート

マルチフィールドビューはコピーではなくビューを返す

たとえば、arr [['f1'、 'f3']]などの複数のフィールドを持つ構造化配列にインデックスを付けると、コピーではなくビューが元の配列に返されます。返されるビューには、以前とは異なり、元の配列の間にあるフィールドに対応する追加のパディングバイトが含まれることが多く、arr [['f1'、 'f3']]。view( 'float64')などのコードに影響します。この変更はnumpy 1.7以降に計画されています。このパスにヒットする操作により、FutureWarningsが発生しています。この変更に関する追加のFutureWarningsは1.12で追加されました。

これらの変更に対応するためにユーザーがコードを更新できるようにするために、numpy.lib.recfunctionsモジュールにそのような操作を安全に許可する多くの関数が追加されました。たとえば、上記のコードは、structured_to_unstructured(arr [['f1'、 'f3']]、dtype = 'float64')で置き換えることができます。ユーザーガイドの「複数のフィールドへのアクセス」セクションを参照してください。

3
hpaulj

root_numpy の関数rec2arrayを使用した非常にシンプルなソリューション:

np_array = rec2array(x)

root_numpyは実際には非推奨ですが、rec2arrayコードはとにかく便利です(ソース- ここ ):

def rec2array(rec, fields=None):

  simplify = False

  if fields is None:
      fields = rec.dtype.names
  Elif isinstance(fields, string_types):
      fields = [fields]
      simplify = True

  # Creates a copy and casts all data to the same type
  arr = np.dstack([rec[field] for field in fields])

  # Check for array-type fields. If none, then remove outer dimension.
  # Only need to check first field since np.dstack will anyway raise an
  # exception if the shapes don't match
  # np.dstack will also fail if fields is an empty list
  if not rec.dtype[fields[0]].shape:
      arr = arr[0]

  if simplify:
      # remove last dimension (will be of size 1)
      arr = arr.reshape(arr.shape[:-1])

  return arr
0