Python 将数据类型对象的numpy数组转换为数据类型复合体

Python 将数据类型对象的numpy数组转换为数据类型复合体,python,numpy,Python,Numpy,我有一个numpy数组,我想把它从一个对象转换成复数。如果将该数组作为dtype字符串进行转换,则不会出现问题: In[22]: bane Out[22]: array(['1.000027337501943-7.331085223659654E-6j', '1.0023086995640738-1.8228368353755985E-4j', '-0.017014515914781394-0.2820013864855318j'], dtype='|

我有一个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对象并且我试图转换它时,我得到一个错误,即需要一个float。为什么会这样

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    

我认为您可能需要执行以下操作,具体取决于 对象类型,如果不需要担心填充:

bane.view(np.complex64) or
bane.view(np.complex128)
但是,如果这不起作用(对于我尝试过的一些小元组示例来说,这是不起作用的),那么以下操作就起作用了:

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

考虑对基本数据类型使用numpy结构而不是对象,这样可能会更容易。

听起来可能像是一个numpy错误。很难判断转换在
numpy
代码中的何处进行。字符串到复杂的转换可能已经工作了很长一段时间,而对象数据类型的开发是更新和持续的。什么在生成这种类型的对象数组?一个
dtype=np.object
数组可以包含任何类型的Python对象,因此我认为可以理解的是,numpy开发人员没有费心在这里实现所有可能的类型转换规则。将
.astype(np.str).astype(np.complex)
链接在一起实际上似乎是一个非常合理的解决方案,它必须是一个非常罕见的用例。我脑子里真正的问题是,为什么首先要处理一个包含字符串格式复数的
np.object
数组!我不认为这是完整的解释。串联浮点和复杂浮点应该安全地将结果强制转换为复杂浮点。我看不出你怎么会得到任何涉及字符串的东西,除非
DataFrame
中的那些列已经是开始的字符串。它们是开始的字符串列表,表示浮点数和复杂值。。。很抱歉给你带来了困惑。我返回并使用一条记录将它们作为浮点和复数进行转换,正如您所建议的那样,这消除了处理dtype=object的需要。
bane.astype(np.float).view(np.complex64)