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することを期待します。
エラーや警告はスローされません。虚数部が失われることもありません。
1.16.1
3.6.7(デフォルト、2018年10月22日、11:32:17)
[GCC 8.2.0]
Numpyは複素数のフロアをとることができないため、エラーを出す代わりに、虚数部を削除するだけです。したがって、Numpyはうまく機能していると思います。
さて、他の関数と同様に、虚数部が削除されるという警告を少なくともスローする価値があると思いました。
通常のPythonはエラーをスローしますが、誰かがユースケースを考えられない限り、おそらくそれに倣うべきだと思われますか?
ええ、TypeErrorをスローする必要があると思います。
それに取り組むことはできますか?
個人的には、数学的に完全に正しいわけではありませんが、(2 + 2j)// 2 =(1 + 1j)を好むでしょう。
何が最善かわからない、残りは単に複雑なものには実装されていません(エラーをスローします)。 そして、エラーが発生した場合は、最初に非推奨にする必要があります。
もちろん、それに取り組むことはできますが、ufuncがどのように機能し、生成されるかについて少し詳しく説明する必要があるため、それほど簡単ではないかもしれません。また、どこに行きたいかについても議論が必要な場合があります。 しかし、それはあなたを止める必要はありません。
「あいまいさに直面して、推測する誘惑を拒否します。」 TypeError
である必要があることを示唆しています。
@ kaivu1999-これに対処するには、 floor_divide
ufuncで生成されないように複合型を削除するのがおそらく最善でしょう( divmod
、 remainder
、および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
トレースバック(最後の最後の呼び出し):
ファイル "
TypeError:ufunc'floor_divide 'は入力タイプでサポートされておらず、キャストルール' 'safe' 'に従って、サポートされているタイプに入力を安全に強制変換できませんでした
`
プルリクエストを生成しますか?
@ kaivu1999プルリクエストは良いスタートです。 必ず最初のコメントにFixes #13236
を入れてください。これにより、問題とPRが相互参照されます。
ガウス整数が結果であると文書化する場合、実数部と虚数部の両方で床分割を行うことはある程度意味があります。 ただし、これはPythonとは一致しません。