Python 将数据类型对象的numpy数组转换为数据类型复合体
我有一个numpy数组,我想把它从一个对象转换成复数。如果将该数组作为dtype字符串进行转换,则不会出现问题: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='|
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)