将结构化数组转换为常规 NumPy 数组

新手上路,请多包涵

我想答案会很明显,但我现在还没有看到。

如何将记录数组转换回常规 ndarray?

假设我有以下简单的结构化数组:

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

然后我想将其转换为:

 array([[ 1.,  4.],
       [ 2., -1.]])

我尝试 asarrayastype ,但这没有用。

更新(已解决:float32 (f4) 而不是 float64 (f8))

好的,我尝试了 Robert ( 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]])

这是一个带有其他数字和另一种形状的数组。我做错什么了?

原文由 joris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 710
2 个回答
[~]
|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.]])

原文由 Robert Kern 发布,翻译遵循 CC BY-SA 3.0 许可协议

最简单的方法可能是

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

float 通常必须替换为 --- 中的元素类型 x : x.dtype[0] )。这假定所有元素都具有相同的类型。

此方法一步即可为您提供常规 numpy.ndarray 版本(与 view(…).reshape(…) 方法所需的两个步骤相反。

原文由 Eric O Lebigot 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题