Numpy: np.floor_divideは虚数部をサイレントにドロップします

作成日 2019年04月01日  ·  13コメント  ·  ソース: numpy/numpy

コード例の再現:

import numpy as np
a = np.arange(10) + 1j* np.arange(10)
a
# array([0.+0.j, 1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j, 5.+5.j, 6.+6.j, 7.+7.j,
#           8.+8.j, 9.+9.j])
a / 2
# array([0. +0.j , 0.5+0.5j, 1. +1.j , 1.5+1.5j, 2. +2.j , 2.5+2.5j,
#          3. +3.j , 3.5+3.5j, 4. +4.j , 4.5+4.5j])
a // 2
# array([0.+0.j, 0.+0.j, 1.+0.j, 1.+0.j, 2.+0.j, 2.+0.j, 3.+0.j, 3.+0.j,
#          4.+0.j, 4.+0.j])

この動作には特別な理由がありますか? 虚数部と複素数部をfloor_divideすることを期待します。

エラーメッセージ:

エラーや警告はスローされません。虚数部が失われることもありません。

Numpy / Pythonのバージョン情報:

1.16.1
3.6.7(デフォルト、2018年10月22日、11:32:17)
[GCC 8.2.0]

00 - Bug 15 - Discussion numpy.ufunc

全てのコメント13件

複素数のフロア関数を使用することはできません。
複素数のフロア
また、虚数部と複素数部を分けません。 2つの複素数を除算すると1つの複素数が得られます。 (複素数の除算

また、
`>>>(1。+ 1.j)// 2

トレースバック(最後の最後の呼び出し):
ファイル ""、1行目、
TypeError:複素数のフロアを取ることはできません。`

同様に、 TypeErrorが表示されます。
私はオープンソースに不慣れです。 やりたいです。 誰かが私を導くことができますか?

Numpyは複素数のフロアをとることができないため、エラーを出す代わりに、虚数部を削除するだけです。したがって、Numpyはうまく機能していると思います。

さて、他の関数と同様に、虚数部が削除されるという警告を少なくともスローする価値があると思いました。

通常のPythonはエラーをスローしますが、誰かがユースケースを考えられない限り、おそらくそれに倣うべきだと思われますか?

ええ、TypeErrorをスローする必要があると思います。
それに取り組むことはできますか?

個人的には、数学的に完全に正しいわけではありませんが、(2 + 2j)// 2 =(1 + 1j)を好むでしょう。

何が最善かわからない、残りは単に複雑なものには実装されていません(エラーをスローします)。 そして、エラーが発生した場合は、最初に非推奨にする必要があります。

もちろん、それに取り組むことはできますが、ufuncがどのように機能し、生成されるかについて少し詳しく説明する必要があるため、それほど簡単ではないかもしれません。また、どこに行きたいかについても議論が必要な場合があります。 しかし、それはあなたを止める必要はありません。

「あいまいさに直面して、推測する誘惑を拒否します。」 TypeErrorである必要があることを示唆しています。

@ kaivu1999-これに対処するには、 floor_divide ufuncで生成されないように複合型を削除するのがおそらく最善でしょう( divmodremainder 、およびmodf注意してください) core/src/umath/loops.c.src調べます(2480〜2500行目を削除する可能性があります)。

@mhvkええ、 numpy/core/code_generators/generate_umath.pyも調整する必要がありますが、最初に非推奨にする場合は、おそらくカスタム型リゾルバーを作成する必要があります(さらにnumpy/core/src/umath/ufunc_type_resolution.c触れます)。

@ seberg-現在の動作は実際にはバグと見なされるべきであり、 remainderおよびdivmodとの一貫性を保つために、エラーの発生を開始する必要があるようです。

別の動作が必要かどうかは、別の議論のように思われます。

ええ、私はそれに取り組んでいます。
私はそのようなコードを変更しました、そして今それは示します:
`>>> a // 2

トレースバック(最後の最後の呼び出し):
ファイル ""、1行目、
TypeError:ufunc'floor_divide 'は入力タイプでサポートされておらず、キャストルール' 'safe' 'に従って、サポートされているタイプに入力を安全に強制変換できませんでした
`
プルリクエストを生成しますか?

@ kaivu1999プルリクエストは良いスタートです。 必ず最初のコメントにFixes #13236を入れてください。これにより、問題とPRが相互参照されます。

ガウス整数が結果であると文書化する場合、実数部と虚数部の両方で床分割を行うことはある程度意味があります。 ただし、これはPythonとは一致しません。

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