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

2025-03-20 08:47:00
admin
原创
43
摘要:问题描述:我认为答案会非常明显,但目前我还没有看到。如何将记录数组转换回常规 ndarray?假设我有以下简单的结构化数组:x = np.array([(1.0, 4.0,), (2.0, -1.0)], dtype=[('f0', '<f8'), ('f1', '<f8')]) 然后我想将其转换...

问题描述:

我认为答案会非常明显,但目前我还没有看到。

如何将记录数组转换回常规 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]])

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


解决方案 1:

最简单的方法可能是

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

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

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

解决方案 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.]])

解决方案 3:

结合处理多字段索引方式的变化,numpy提供了两个可帮助转换为/从结构化数组的新功能:

在 中numpy.lib.recfunctions,这些是structured_to_unstructuredunstructured_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')。请参阅用户指南的“访问多个字段”部分。

解决方案 4:

np.array(x.tolist())
array([[ 1.,  4.],
      [ 2., -1.]])

但也许有更好的方法......

解决方案 5:

使用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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用