Numpy: バグ: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))

上記もバグと考えるべきだと思います。

ドキュメントで説明されているように、ufuncの場合、「キャストルールは、データ型を別のデータ型に「安全に」キャストできる場合の問題によって実装される」という質問は常に真実だと思います。 キャストが安全ではない上記のような例外があるように見えますが、ufuncを機能させるようにしました。 この場合、promote_typesはまだ無効な型の昇格を言うべきだと思います(np.promote_types( "float32"、 "m8")とnp.promote_types( "m8"、 "float32")の両方)。 ufuncを引き続き機能させる必要があるかどうかは、ケースバイケースで判断できますか?

はい、 np.promote_typesは常に合理的な一般的なルールでなければならないことを明確に区別する必要があります。 そのため、「一般的なdtype」という用語が好きです。 これは、たとえばnp.concatenateで使用できるdtypeです。

各ufuncは、「共通dtype」または他のロジックを使用して特定の操作を実装することを個別に決定できます。 私たちは特に倍数とtimedelta64に対してそれを行うので、それは確かに別の問題です。

ご存知のように、ufuncsは主にnp.can_cast(..., ...)依存しているため、実際には多くの場所でこのロジックを使用していないと思います。 そして、それは通常、タイププロモーションと一致していますが、ここにはありません。

上記の議論を踏まえて、私は先に進み、promote_typesの修正を追加しました。

このページは役に立ちましたか?
0 / 5 - 0 評価