Python 确定NumPy类型的加宽转换

Python 确定NumPy类型的加宽转换,python,numpy,types,Python,Numpy,Types,我有一个基于NumPy的库,其中有几个类重载算术运算。由于大量的错误检查,内部有点毛茸茸的,但我在如何执行时遇到了一个严重的问题 该库背后的思想是使它非常容易和直观地使用,只需程序员花费最少的语法和精力。因此,我希望能够轻松地组合不同数据类型的数组,并简单地将较窄的数据类型转换为较宽的数据类型 例如,如果我有两个数组,一个是dtypefloat64,另一个是dtypecomplex128,当将它们添加在一起时,我想将float64转换为complex128,但如果它是float64和comple

我有一个基于NumPy的库,其中有几个类重载算术运算。由于大量的错误检查,内部有点毛茸茸的,但我在如何执行时遇到了一个严重的问题

该库背后的思想是使它非常容易和直观地使用,只需程序员花费最少的语法和精力。因此,我希望能够轻松地组合不同数据类型的数组,并简单地将较窄的数据类型转换为较宽的数据类型

例如,如果我有两个数组,一个是dtype
float64
,另一个是dtype
complex128
,当将它们添加在一起时,我想将
float64
转换为
complex128
,但如果它是
float64
complex192
,我想转换为它。但是,如果它是
float64
complex64
的组合,则两者之间没有有效的转换而不会丢失
float64
的精度,因此我希望将两者都转换为
complex128

我立即发现了一个问题,即如果我想让我的库变得完全健壮,我必须寻找每种类型的组合,并确定它们的最窄的公共加宽类型(想想最小公共倍数)。我不想将所有内容都转换为尽可能宽的类型,因为这样会很快导致内存效率低下,而且我经常在内存中存储非常大的数组


有没有一个好方法来确定两种NumPy类型之间最窄的公共加宽类型?

我认为NumPy内部已经做到了这一点,那么问问NumPy如何

(zeros([],dtype=float64)+zeros([],dtype=complex64)).dtype
=> dtype('complex128')

(zeros([],dtype=float32)+zeros([],dtype=complex64)).dtype
=> dtype('complex64')
您可以将其概括为一个函数:

def common_dtype(dtypes):
    return np.sum([np.zeros([],dtype=d) for d in dtypes]).dtype

@阿玛脲的想法是正确的;事实上,numpy中已经存在用于此目的的函数。
看一看,然后

我喜欢
common\u dtype
函数,这正是我想要了解的,而@WarrenWeckesser似乎是实现这一点的首选方法。尽管amaurea的解决方案可行,但我必须承认这两个函数更适合。如果你把它作为一个答案,我会接受的。可能是重复的谢谢,这个解决方案只需要对我当前的代码做三行修改就可以修复这个错误,这正是我所需要的,而且绝对是实现这个目标的惯用方法。