【问题标题】:Converting a numpy array of dtype objects to dtype complex将 dtype 对象的 numpy 数组转换为 dtype complex
【发布时间】:2015-03-13 21:47:23
【问题描述】:

我有一个 numpy 数组,我想将它从一个对象转换为复杂的。如果我将该数组作为 dtype 字符串并进行转换,则没有问题:

In[22]: bane
Out[22]: array(['1.000027337501943-7.331085223659654E-6j',
       '1.0023086995640738-1.8228368353755985E-4j',
       '-0.017014515914781394-0.2820013864855318j'], 
       dtype='|S41')

In [23]: bane.astype(dtype=complex)
Out[23]: 
array([ 1.00002734 -7.33108522e-06j,  1.00230870 -1.82283684e-04j,
       -0.01701452 -2.82001386e-01j])

但是当它是 dtype 对象并且我尝试转换它时,我收到一个错误,即需要浮点数。这是为什么呢?

In [24]: bane.astype(dtype=object)
Out[24]: 
array(['1.000027337501943-7.331085223659654E-6j',
       '1.0023086995640738-1.8228368353755985E-4j',
       '-0.017014515914781394-0.2820013864855318j'], dtype=object)

In [25]: _.astype(dtype=complex)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-f5d89c8cc46c> in <module>()
----> 1 _.astype(dtype=complex)

TypeError: a float is required    

为了转换它,我使用了两个对 astype 方法的调用,这看起来很笨拙:

bane_obj
Out[27]: 
array(['1.000027337501943-7.331085223659654E-6j',
       '1.0023086995640738-1.8228368353755985E-4j',
       '-0.017014515914781394-0.2820013864855318j'], dtype=object)

In [28]: bane_obj.astype(dtype=str).astype(dtype=complex)
Out[28]: 
array([ 1.00002734 -7.33108522e-06j,  1.00230870 -1.82283684e-04j,
       -0.01701452 -2.82001386e-01j])

【问题讨论】:

  • 听起来像是一个 NumPy 错误,也许吧。
  • 很难判断转换发生在numpy 代码的哪个位置。字符串到复杂的转换可能已经工作了很长时间,而对象 dtypes 的开发是更新和持续的。是什么生成了这种对象数组?
  • dtype=np.object 的数组实际上可以包含 任何 种 Python 对象,所以我认为 numpy 开发人员没有费心在此处实现所有可能的类型转换规则是可以理解的.将.astype(np.str).astype(np.complex) 链接在一起实际上似乎是一个非常合理的解决方法,因为它必须是一个非常不常见的用例。我心中真正的问题是,为什么你必须首先处理一个包含字符串格式复数的 np.object 数组!
  • 我认为这不是完整的解释。连接浮点数和复数浮点数应该安全地将结果转换为复数。除非DataFrame 中的那些列一开始就已经是字符串,否则我看不出你最终会如何处理涉及字符串的任何内容。
  • 它们是开头的字符串列表,代表浮点数和复杂值...抱歉造成混淆。我返回并使用记录将它们预先转换为浮点数和复数,正如您所建议的,这消除了处理 dtype=object 的需要。

标签: python numpy


【解决方案1】:

我认为您可能想要执行以下操作,具体取决于内部的内容 对象类型以及是否无需担心填充:

bane.view(np.complex64) or
bane.view(np.complex128)

但是,如果这不起作用,对于我尝试过的一些小元组示例,它不起作用,则以下方法起作用:

bane.astype(np.float).view(np.complex64)

考虑使用 numpy 结构而不是对象作为基本 dtype,总体而言,您可能会更轻松。

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多