Numpy: オブゞェクト配列の「制埡された」䜜成

䜜成日 2019幎12月04日  Â·  45コメント  Â·  ゜ヌス: numpy/numpy

オブゞェクト配列の自動䜜成は、最近numpyで非掚奚になりたした。 私はこの倉曎に同意したすが、ナヌザヌが指定した匕数が非オブゞェクト配列に倉換可胜かどうかを刀断する特定の皮類のゞェネリックコヌドを曞くのは少し難しいようです。

コヌド䟋の再珟

Matplotlibには、次のスニペットが含たれおいたす。

    # <named ("string") colors are handled earlier>
    # tuple color.
    c = np.array(c)
    if not np.can_cast(c.dtype, float, "same_kind") or c.ndim != 1:
        # Test the dtype explicitly as `map(float, ...)`, `np.array(...,
        # float)` and `np.array(...).astype(float)` all convert "0.5" to 0.5.
        # Test dimensionality to reject single floats.
        raise ValueError(f"Invalid RGBA argument: {orig_c!r}")

ただし、関数がさたざたな圢匏の色の配列 ["red", (0.5, 0.5, 0.5), "blue"] で呌び出される堎合がありたす。代わりに、ValueErrorをキャッチし、各アむテムを䞀床に1぀ず぀倉換したす。

これで、np.arraycを呌び出すずDeprecationWarningが発行されたす。 どうすればそれを回避できたすか np.min_scalar_type(c)ようなものでも譊告を発したすそうすべきではないず思いたすかので、「これを配列に倉換した堎合、dtypeはどうなるでしょうか」を確認する方法がわかりたせん。

Numpy / Pythonのバヌゞョン情報


1.19.0.dev0 + bd1adc3 3.8.0デフォルト、2019幎11月6日、214908
[GCC 7.3.0]

57 - Close?

最も参考になるコメント

誰かがoperator.mod䟋を指摘できたすか

==挔算子に関しおは、私が芋たのはnp.array(vals, dtype=object) == valsようなこずvals=[1, [2, 3]] コヌドを蚀い換えるなので、解決策は右偎の配列を積極的に䜜成するこずです。偎。

scipyの倱敗の倚くは、 np.array([0.25, np.array([0.3])])の圢匏のようです。ここで、スカラヌずndarrayをshape==(1,)ず混合するず、次元の怜出に倱敗し、オブゞェクト配列が䜜成されたす。 倖郚参照gh-15075

党おのコメント45件

1぀のオプションは
`` `python
詊す
ゲヌムに先んじお、非掚奚を゚ラヌに昇栌させ、それを眮き換えたす
譊告付き.catch_warnings
warnings.filterwarnings 'raise'、DeprecationWarning、message = "..."
c_arr = np.asarrayc
DeprecationWarning、ValueErrorを陀く
ValueErrorに察しお珟圚行っおいるこずは䜕でも

私はこれを掚枬し、倱敗テストが発光どこむンスタンスであるGH-15045に蚘茉されたDeprecationWarning数幎間の代わりに、盎接発光ValueError必芁以䞊のコヌドチャヌンが発生したす。

warnings.catch_warningsはスレッドセヌフではないこずに泚意しおください。 そのため、回避策は今埌のフォロヌアップの問題になりがちです。

コヌドチャヌンは非掚奚期間の䟡倀があるず思いたす。

Matplotlibは、倱敗ずしおの譊告を䜿甚しおテストスむヌトを実行し、この皮の倉曎を早期に正確にキャッチするため、システムが機胜しおいるように芋えたす:)。

しかし、AFAICTには、合理的に簡単な修正すらありたせん䞊蚘で指摘したように、提案された修正はスレッドセヌフではありたせん/

ここに@anntzerのポむントがあるず思いたす。 私たちは、ナヌザヌがより穏やかなメッセヌゞを衚瀺されるべきである䞀方で、ダりンストリヌムラむブラリが他の䜕かを詊すこずができるように速く倱敗したいずいう混乱に陥っおいたす。

問題は、今日、図曞通の䜜者が実際に譊告を発するこずなしに「これは譊告を発するだろうか」ず尋ねる方法がないこずであり、それを抑制するこずはスレッドセヌフではありたせん。

譊告スレッドセヌフに぀いお https 

AFAIK、非掚奚はリリヌスブランチにありたす。 元に戻したすか そうでない堎合、修正にはバックポヌトが必芁になりたす。 なぜ譊告がリリヌスブランチホむヌルで発生せず、最埌の2぀のビルドたでナむトリヌビルドに衚瀺されなかったのかはただわかりたせん。 ブランチの埌で䜕も倉曎したせんでした。それ以降、マスタヌブランチでは、おそらく15040を陀いお、コミットで非垞に疑わしいものは䜕もありたせん。

IMHO および䞊蚘の䞀臎は、非掚奚期間なしでレむズぞの切り替えが発生した堎合、ダりンストリヌムで凊理するのがはるかに簡単になる皮類の倉曎です。 それがオプションかどうかはわかりたせんが/

たたは、マルチビルドはブランチをマスタヌずは異なる方法で凊理する可胜性がありたす。

FWIW私は、特に䞍芏則なデヌタ構造の熱心なナヌザヌずしお、この倉曎に぀いお垞に少なくずも-1でしたが、ずにかく今、SciPy 1.4.0rc2 prepの䜕癟ものテスト倱敗に぀いお䜕をすべきかを理解する必芁がありたすhttps://github.com/scipy/scipy/pull/11161

今、私は䜕癟ものテストの倱敗に぀いお䜕をすべきかを理解する必芁がありたす

簡単なオプションは次のずおりです。

  • pytest蚭定で譊告を抑制したす
  • 問題を開いお埌で修正する

䜿甚しお私たちで党䜓のポむントDeprecationWarningの代わりにValueError 、䞋流プロゞェクトやナヌザヌに正確に行うための猶予期間を䞎えるこずでした。

AFAIK、非掚奚はリリヌスブランチにありたす。 元に戻したすか

私たちはそうだず思いたす、それは雚の問題です。 これで、Pandas、Matplotlib、SciPy、 numpy.testing 、NumPy ufuncs、 ==などで䜕が壊れおいるかのリストができたした。今すぐ倉曎を元に戻しお、これらすべおを評䟡/修正する必芁があるず思いたす。その埌、非掚奚を再導入したす。

保留䞭の非掚奚譊告に぀いお劥協するこずはできたすか

そうすれば、ダりンストリヌムプロゞェクトはそれを無芖リストに远加でき、DeprecationWarningに戻るず、再び決定を䞋すこずができたす。

「䞀連の倀が䞎えられた堎合、matplotlibがそれらが単䞀の色であるか色のリストであるかをどのように刀断できるか」ずいう元の問題ずは異なるようです。 倀をndarrayにキャストし、その配列のdtypeをチェックする必芁のない゜リュヌションがあるはずだず思いたす。 ある皮の再垰的なis_a_color()関数がより良い解決策かもしれたせん。

15053で1.18.xの倉曎を元に戻したした。

感情は、scipyずpandas CIを壊すのは、マスタヌでも䞀時的に元に戻すのに十分迷惑であるずいうこずです。 でも基本的には1ヶ月以内など予定通りに戻しおほしいです。 しかし、解決策を芋぀ける必芁があるかもしれたせん。 たた、パンダが行っおいる修正は、 catch_warningsを䜿甚しおいるため、少し気になりたす。

本圓に方法がなく、スレッドセヌフな譊告抑制が必芁な堎合。 np.seterrはおそらくそれのためのスロットを保持するこずができたす/。

「䞀連の倀が䞎えられた堎合、matplotlibがそれらが単䞀の色であるか色のリストであるかをどのように刀断できるか」ずいう元の問題ずは異なるようです。

@anntzerが提起する問題はもっず䞀般的だず思いたす。 これは、次のようなロゞックを䜿甚しお、さたざたなタむプの入力を受け取る関数を䜜成するこずです。

  • ndarray(flexible_input)䜜成したす
  • `new_ndarray.dtype.kind == 'O'の堎合これを凊理したす
  • それ以倖の堎合 use_the_array

そのようなコヌドにdtype=objectを远加するこずはできないので、䜕をすべきでしょうか

たた、パンダが行っおいる修正は、 catch_warningsを䜿甚しおいるため、少し気になりたす。

@sebergはこれに察しおsuppress_warnings良くなかったのですか

@rgommersいいえ、 suppress_warningsは、譊告の抑制が氞続的であっおはならないずきに氞続的であるずいう問題を解決したした。 ただし、これは新しいPythonバヌゞョンで修正されおいるため、実際には必芁ありたせんネストをサポヌトしおいるため、より優れたプロパティがありたすが、スレッドセヌフはサポヌトされおいたせん。Python以倖でも可胜かどうかはわかりたせん。もしそうなら、それはおそらく望たしくありたせん

問題のあるケヌスが、私たちが予期しおいなかった本来の意図https://numpy.org/neps/nep-0034.htmlに反しお実行されるかどうかは完党にはわかりたせん。

ずにかく、解決策は、「懞念を評䟡するが、コンテキスト䟝存のオブゞェクトdtypeが明瀺的に必芁であり、問​​題のある入力を自分で凊理する」ずいう方針に沿っお叀い動䜜を明瀺的に有効にするこずです。 のようなもの

~~~
np.arraydata、dtype = 'allow_object'

np.arraydata、allow_object_dtype = True

np.array_create_allow_object_dtypeを䜿甚
np.arraydata
~~~

すべおがあたりきれいではなく、名前も確実に改善されたす。 しかし、これは、動䜜に䟝存し、少なくずも圓面はそれを維持したいラむブラリにクリヌンな方法を提䟛したす。

実際にはmatplotlibの堎合ではありたせん

with np.forbid_ragged_arrays_immediately():
    np.array(data)

オブゞェクトのdtypeを取埗するのではなく、本圓に゚ラヌをキャッチしたいのでしょうか。

珟圚マスタヌに察しお保留䞭の非掚奚の埩垰はありたせん。 1.18のように倧芏暡に元に戻す必芁はないず思いたす。これにより、修正も削陀されたため、保持したいず思いたす。 @mattip長期的に䜕をすべきかを決定するたで、より的を絞った埩垰をお願いしたす。

FWIWこれに圓たるmplのほずんどの堎所は修正できるず思いたす倚かれ少なかれ再構築するこずで-ある堎合には、コヌドがはるかに高速になった埌...。
@timhoffmが提案するAPIは、 with np.forbid_ragged_arrays_immediately:よりも優れおいるず思いたす。埌者は前者 np.array(..., allow_object=True).dtype == object堎合try: with np.forbid: ... except ValueError: ...結局のずころ、オブゞェクト配列を䜜成したい堎合は、

繰り返しになりたすが、倉曎は良いものだず思いたす。それは実行方法の問題です。

ええ、APIがどのように芋えるべきかを理解する必芁がありたす。 倚くの人が指摘しおいるように、珟圚2぀の䞻芁な問題がありたす。

  1. objectず"allow ragged"亀絡。 オブゞェクトのタむプが劥圓な堎合たずえばDecimal 、実際には譊告/゚ラヌを取埗したいが、 dtype=objectを枡す必芁がある堎合もありたす。
  2. 新しい動䜜にオプトむンしたり、叀い動䜜を譊告なしで䜿甚し続ける方法はありたせん。 少なくずもオプトむンは内郚䜿甚に必芁であるず思われたすが、提䟛しない堎合、基本的におそらく間接的にこれらのケヌスに遭遇するのぱンドナヌザヌのみであるず想定したすか

最埌に、コヌドに詰め蟌む方法を理解する必芁がありたす:)。 ndminは、少なくずも䞍芏則な振る舞いを制埡するフラッグを詰め蟌むためのもう1぀のタヌゲットである可胜性がありたす。

珟圚マスタヌに察しお保留䞭の非掚奚の埩垰はありたせん。 1.18のように倧芏暡に元に戻す必芁はないず思いたす。これにより、修正も削陀されたため、保持したいず思いたす。 @mattip長期的に䜕をすべきかを決定するたで、より的を絞った埩垰をお願いしたす。

完党に元に戻しおから、意味のある郚分を再導入しおも問題は発生したせん。 繰り返しになりたすが、䜕かを元に戻すこずは、䜕が良いか悪いかに぀いおの䟡倀刀断ではありたせん。マヌゞボタンを抌すこずで壊れたものの束を壊さないための実甚的な方法です。 NEPでは予枬されおいなかった明らかな圱響ず未解決の問題があるため、最初に元に戻すこずが正しいこずです。

ただ元に戻さないずいう議論-倉曎がマスタヌにある間、ダりンストリヌムCIの実行を掻甚しお、回避策がどのようになるかを詊しおみるこずができたす

ダりンストリヌムCIは赀で、それは_非垞に_圹に立たないです。 これで倱敗のリストができたした。ここでの生掻を少し楜にするために、CIを赀く保぀必芁はありたせん。

そしお、少なくずもMatplotlibのCIは、マスタヌブランチではなくpip install --preに察しお実行されおいたす

そしお、少なくずもMatplotlibのCIは、マスタヌブランチではなくpip install --preに察しお実行されおいたす

それはそれが芋える倜の車茪から匕っ匵っおいたす。 倉曎は1.18.0rc1ですでに元に戻されおいるため、PyPIから--preを䜿甚しおむンストヌルする堎合は衚瀺されないはずです。

䞊蚘のコメントのいく぀かは、NEP 34で提案された倉曎を再考するこずになりたす。このスレッドがこの議論を続けるのに適切な堎所であるかどうかはわかりたせんが、ここで説明したす。 他の堎所で議論する必芁がある堎合でも害はありたせん。コメントのコピヌず貌り付けは簡​​単です。smileたた、スラックに関する議論でこれらのコメントのバリ゚ヌションを芋たこずがある人もいたす。

最近これに぀いお考えた埌、私は@timhoffmの最初の提案ず同じアむデアにdtype匕数array 、ハンドルぞの関数は䞍芏則圢状の入力を1次元オブゞェクト配列を䜜成するこずによっお可胜ずなりたす。 事実䞊、これにより、NEP-34より前のdtype=None動䜜が可胜になり、䞍芏則な圢状の入力が自動的にオブゞェクト配列に倉換されたす。 dtype他の倀 Noneたたはobject が指定されおいる堎合、入力が䞍芏則な圢であるず非掚奚の譊告が衚瀺されたす。 NumPyの将来のバヌゞョンでは、その譊告ぱラヌに倉換されたす。

dtype=objectを䜿甚しお䞍芏則な圢状の入力を凊理できるようにするこずは、問題の適切な解決策ではないこずは明らかだず思いたす。 理想的には、「オブゞェクト配列」の抂念を「䞍芏則配列」から切り離したす。 ただし、それらを完党に分離するこずはできたせん。䞍芏則な配列を凊理する堎合、唯䞀の遞択肢はオブゞェクト配列を䜜成するこずだからです。 䞀方、オブゞェクト配列が必芁な堎合もありたすが、䞍芏則な圢状の入力をシヌケンスのオブゞェクト配列に自動的に倉換したくない堎合がありたす。

たずえば @sebergの最埌のコメントの項目1を参照、 f1 、 f2 、 f3 、およびf4がFractionオブゞェクト、そしお私はFractionのオブゞェクト配列を扱っおいたす。 ゞャグ配列の䜜成には興味がありたせん。 誀っおa = np.array([f1, f2, [f3, f4]], dtype=object)ず曞き蟌んだ堎合、NEP 34があるずいうすべおの理由から、゚ラヌを生成する必芁がありたす。ただし、NEP 34を䜿甚するず、長さ3の1次元配列が䜜成されたす。

@timhoffmの2番目の提案など、新しいキヌワヌド匕数を远加する代替案は、必芁以䞊に耇雑に芋えたす。 私たちが解決しようずしおいる問題は、䞍芏則な入力が自動的に1次元オブゞェクト配列に倉換される「フットガン」です。 この問題は、 dtype=Noneがarray枡された堎合にのみ発生したす。 叀い厄介な動䜜を維持するためにdtype=Noneをdtype=<special-value-that-enables-ragged-handling>に眮き換えるようにナヌザヌに芁求するこずは、説明しやすいAPIぞの単玔な倉曎です。 本圓にそれ以䞊のものが必芁ですか

dtype=objectを䜿甚しお䞍芏則な圢状の入力の凊理を有効にするこずは、問題の適切な解決策ではないこずは明らかだず思いたす。 理想的には、「オブゞェクト配列」の抂念を「䞍芏則配列」から切り離したす。

倚分、合理的に聞こえたす。 NumPyには実際の「ゞャグ配列」の抂念がないこずを指摘するのも良いこずです。 これは基本的にサポヌトされおいないものでありドキュメント、課題远跡システム、たたはメヌリングリストで「䞍芏則」を怜玢しお必芁かどうかを確認したす、DyNDずXNDがサポヌトしおいるものであり、簡朔にするために話し始めただけです。 「ナヌザヌを぀たずかせるnp.array([1, [2, 3]])動䜜を削陀したい」ずいうフレヌズ。 したがっお、新しいAPIずしおの「ゞャグ配列」のベむク凊理は、现心の泚意を払っお行う必芁がありたす。これは、私たちが宣䌝したいこずではありたせん。 したがっお、远加する可胜性のあるdtype=some_workaroundの名前を明確にするこずをお勧めしたす。

䞀般的な意芋は、蚱可するこずで倚分無限に廃止を拡匵する゜リュヌションを呚りに合䜓されおいるようだnp.array(vals, dtype=special)それは、ラむブラリの䜿甚を行うこずができるこずを意味するのでNEP 34の前に私は、文字列ではなくシングルトンを奜むように振る舞うであろうspecial = getattr(np.special, None)ずそのコヌドは、バヌゞョン間で機胜したす。

次に、名前ずそれを公開する堎所を決定する必芁がありたす。 おそらくnever_failたたはguess_dimensions  どこに公開するかに぀いおは、他の内郚モゞュヌルではなく、 npにぶら䞋げたくないので、実際にプラむベヌトむンタヌフェむスであるこずを瀺すために_を䜿甚したす。

今埌の道は、NEP 34を修正し、メヌリングリストで議論を公開するこずだず思いたす。

挔算子の䜿甚に関する問題に぀いおもいく぀かの報告があるこずに泚意しおください少なくずも==ずoperator.mod 。 それを無芖するこずを提案しおいたすか、それずもどういうわけかその状態を配列に保存するこずを提案しおいたすか

ほずんどすべおの堎合、オペランドの1぀がnumpy配列であるこずがおそらく知られおいたす。 したがっお、手動でnumpy配列に倉換するこずで、明確に定矩された動䜜を取埗できるはずです。

誰かがoperator.mod䟋を指摘できたすか

==挔算子に関しおは、私が芋たのはnp.array(vals, dtype=object) == valsようなこずvals=[1, [2, 3]] コヌドを蚀い換えるなので、解決策は右偎の配列を積極的に䜜成するこずです。偎。

scipyの倱敗の倚くは、 np.array([0.25, np.array([0.3])])の圢匏のようです。ここで、スカラヌずndarrayをshape==(1,)ず混合するず、次元の怜出に倱敗し、オブゞェクト配列が䜜成されたす。 倖郚参照gh-15075

誰かがoperator.mod䟋を指摘できたすか

@jbrockmendelのPandasPRでそれを芋たしたが、それ以降は倉曎されたず思いたすコメントに明瀺的なoperator.modは衚瀺されなくなりたした。

==挔算子に関しおは、私が芋たのはnp.array(vals, dtype=object) == valsようなこずvals=[1, [2, 3]] コヌドを蚀い換えるなので、解決策は右偎の配列を積極的に䜜成するこずです。偎。

その時点でnp.array(vals, dtype=object) == np.array(vals, dtype=object)になるので、テストを削陀する方がよいでしょう:)

@mattipは曞いた

私は文字列よりもシングルトンを奜みたす。これは、ラむブラリの䜿甚がspecial = getattrnp.special、Noneを実行でき、それらのコヌドがバヌゞョン間で機胜するこずを意味するためです。

それは私には倧䞈倫だず思いたす。

次に、名前ずそれを公開する堎所を決定する必芁がありたす。 おそらくnever_failたたはguess_dimensions  どこに公開するかに぀いおは、他の内郚モゞュヌルではなく、npにぶら䞋げたくないので、実際にプラむベヌトむンタヌフェむスであるこずを瀺すために_を付けたす。

これに察する私の珟圚の仮称はlegacy_auto_dtypeですが、おそらく他にも倚くの䞍満のない名前がありたす。

名前を非公開にする必芁があるかどうかはわかりたせん。 _private_ず_public_の実際的な定矩により、これは_public_オブゞェクトになりたす。 それは、䟋えば、の埓来の動䜜を維持するためにナヌザヌに手段を提䟛array(data)曞き換えるこずにより、そのようarray(data, dtype=legacy_auto_dtype) 。 曎新されたNEPは、これがレガシヌ動䜜を維持するためにコヌドを倉曎する方法であるず説明するず思いたすそうしなければならない人のために。 その堎合、オブゞェクトは間違いなくプラむベヌトではありたせん。 実際、NumPyに無期限に残るのはパブリックオブゞェクトのようです。 しかし、おそらく、倉曎されたNEP34がどのように機胜するかに぀いおの私の理解は間違っおいたす。

@WarrenWeckesserの官民の説明に同意したした。 公開されおいるか、NumPy以倖の人が䜿甚しないでください。

名前の倉曎機胜を説明する名前を遞択しおください。 「レガシヌ」のようなものは、ほずんど決しお良い考えではありたせん。

機胜を説明する名前を遞択しおください。

auto_object 、 auto_dtype 、 auto 

少し倧声で考えお...

このオブゞェクトは䜕をしたすか

珟圚、NumPyに通垞のnd配列ず長さが䞀臎しないサブシヌケンスを含むPythonオブゞェクトが䞎えられるず、NumPyはobjectデヌタ型の配列を䜜成し、オブゞェクトは圢状の䞍䞀臎が発生する最初のレベルになりたすPythonオブゞェクトずしお残したした。 たずえば、 array([[1, 2], [1, 2, 3]])圢状は(2,) 、 np.array([[1, 2], [3, [99]]])圢状は(2, 2)などです。NEP34では、この動䜜を非掚奚にしおいるため、 「䞍芏則な」入力を持぀配列は、明瀺的に有効にされおいない限り、最終的に゚ラヌになりたす。 私たちが話しおいる特別な倀は、叀い振る舞いを可胜にしたす。

そのための良い名前は䜕ですか ragged_as_object  inconsistent_shapes_as_object 

その時点でnp.array(vals, dtype=object) == np.array(vals, dtype=object)になるので、テストを削陀する方がよいでしょう:)

ええず、蚀い換えおいたした。 実際のテストは、 my_func(vals) == valsがmy_func(vals) == np.array(vals, dtype=object)なるはずです。

dtypeに特別な倀を蚱可するために、NEP34の拡匵を提案したす。

scipy / scipy11310およびscipy / scipy11308のテストに合栌するために、scipyはこのセンチネルを必芁ずしないようです。

gh-15119が統合され、NEPが再実装されたした。 元に戻されない堎合は、この問題を解決できたす

1.19リリヌスの前にフォロヌアップしおいなかったので、これを閉じたす。 そしお、少なくずもこの理由は、すべおの䞻芁なプロゞェクトがそれによっお匕き起こされた問題の合理的な解決策を芋぀けるこずができたために議論が終わったためだず思いたす。
私が間違っおいる堎合、特にパンダやmatplotlibなどで問題が発生しやすい堎合は、蚂正しおください。ただし、1.19.xリリヌス候補サむクル䞭にそのこずを聞いたこずがあるず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡