我想减去两个无符号的numpy数组并得到一个带符号的结果。我事先并不知道这些类型。将两者都转换为int64可以正常工作,但如果输入为uint8,则会不必要地浪费空间(转换为int16就足够了)。
我曾想过编写一个函数来返回下一个更大的有符号类型(例如uint8-> int16),最大值为最大签名类型。但是,如果不对数据类型表进行硬编码,我不知道如何做到这一点,这可能会过时。
我认为numpy.results_type或numpy.promote_type可能有所帮助,但我无法弄清楚如何将它们用于此目的。
有没有人有干净的解决方案?
答案 0 :(得分:2)
您可以使用newtype = np.promote_types(x.dtype, np.byte)
,其中x
是未知dtype的无符号数组。由于np.byte
是可能的最小有符号整数类型,newtype
将是x
可以安全转换的最小有符号整数类型。
稍微更清晰的解决方案是将np.byte
作为np.result_type
的参数之一传递:
newtype = np.result_type(x, y, np.byte)
这也会处理x
和y
具有可能不同的dtypes的情况。