Numpy: BUG:timedelta和float促销有时有效

创建于 2020-06-10  ·  4评论  ·  资料来源: numpy/numpy

以下示例不会导致对称结果:

np.promote_types("float32", "m8")
# returns "m8", which is probably wrong
np.promote_types("m8", "float32")
# raises TypeError.

所有其他浮点类型也是如此。 我想知道是否有某种奇怪的逻辑,例如允许某些ufunc调用的黑客程序,但我还没有找到。

00 - Bug numpy.dtype

所有4条评论

看起来至少np.multiply支持此功能。

import numpy as np
print(np.multiply(np.timedelta64(1), 1.2))

我认为以上内容也应视为错误。

我认为对于ufuncs,问题总是存在的,如文档中所述,“何时将数据类型可以“安全地”转换为另一种数据类型的问题实现了广播规则”。 看起来上面有一些例外,其中强制转换不安全,但是我们已经使ufunc起作用了。 我猜在这种情况下,promote_types应该仍然说无效的类型升级(对于np.promote_types(“ float32”,“ m8”)和np.promote_types(“ m8”,“ float32”))。 是否需要继续允许ufunc起作用,可以根据具体情况决定?

是的,我们必须清楚地区分np.promote_types必须是一条总是合理的通用规则。 这就是为什么我喜欢“ common dtype”一词的原因。 例如,这是可以与np.concatenate一起使用的dtype。

每个ufunc可以单独决定使用“ common dtype”或其他逻辑来实现特定的操作。 我们专门针对倍数和timedelta64执行此操作,因此确实是一个单独的问题。

我想我们实际上并没有在很多地方使用此逻辑,因为您注意到ufunc主要依赖np.can_cast(..., ...) 。 虽然这通常与类型提升相符,但此处并不如此。

鉴于以上讨论,我继续进行并添加了对boost_types的修复。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

astrofrog picture astrofrog  ·  4评论

MorBilly picture MorBilly  ·  4评论

dmvianna picture dmvianna  ·  4评论

Foadsf picture Foadsf  ·  3评论

marcocaccin picture marcocaccin  ·  4评论