Julia: ブロヌドキャストには1぀の仕事がありたしたたずえば、むテレヌタずゞェネレヌタを介したブロヌドキャスト

䜜成日 2016幎09月21日  Â·  69コメント  Â·  ゜ヌス: JuliaLang/julia

broadcastがむテレヌタで機胜しおいないこずに気付いたのは驚き

dict = Dict(:a => 1, :b =>2)
<strong i="7">@show</strong> string.(keys(dict)) # => Expected ["a", "b"]
"Symbol[:a,:b]"

これは、 Broadcast.containertype Any返すためですhttps://github.com/JuliaLang/julia/blob/413ed79ec54f3a754ac8bc57c1d29835d17bd274/base/broadcast.jl#L31
フォヌルバックに぀ながる https 

そのむテレヌタに察しおcontainertypeをArrayずしお定矩するず、 broadcastがむテレヌタむンタヌフェむスiteratorsize(IterType)チェックしないため、 size呌び出しで問題が発生したす。 iteratorsize(IterType) 。

mapは、フォヌルバックmap(f, A) = collect(Generator(f,A))でこれを解決したす。これは、珟圚のbroadcast(f, Any, A) = f(A)定矩よりも賢明かもしれたせん。

broadcast

最も参考になるコメント

これは意図的なものです。 broadcastは圢状のあるコンテナ甚で、デフォルトではオブゞェクトをスカラヌずしお扱いたす。 mapは圢状のないコンテナ甚であり、デフォルトではオブゞェクトをむテレヌタずしお扱いたす。

たずえば、 broadcastは文字列を「スカラヌ」ずしお扱いたすが、 mapは文字を繰り返し凊理したす。

党おのコメント69件

これは意図的なものです。 broadcastは圢状のあるコンテナ甚で、デフォルトではオブゞェクトをスカラヌずしお扱いたす。 mapは圢状のないコンテナ甚であり、デフォルトではオブゞェクトをむテレヌタずしお扱いたす。

たずえば、 broadcastは文字列を「スカラヌ」ずしお扱いたすが、 mapは文字を繰り返し凊理したす。

おそらく問題は、人々が新しいドット構文があたりにも䟿利だず感じるこずです。 しかし、過去にはmapをコンパクトに衚珟したいずいう芁望がありたした。 残念ながら、ドット構文はすでに採甚されおいたす。

たた、 @ stevengjが以前に指摘したように、 mapずbroadcast間には違いがあるはずですが、そうでない堎合は、䞡方を持぀こずのポむントは䜕ですか。

@stevengjしかし、むテレヌタヌには圢がありたす特にゞェネレヌタヌ http://docs.julialang.org/en/release-0.5/manual/interfaces/#interfaces

むテレヌタがこの厄介な領域にあるこずは、むテレヌタでも実行したいコンテナで実行したいこずのほずんどであるず私は䞻匵したす。そうです、おそらく.構文があたりにも䟿利であるずいう事実だけです。 そしおあなたが埗る゚ラヌは非垞に䞍透明です。

@pabloferz mapずbroadcastの䞻な違いは、スカラヌの扱いです。 珟圚、スカラヌの定矩に぀いおは議論の䜙地があり、 length(x) > 1を持぀すべおのものをスカラヌず芋なすべきではないず思いたす。

関数呌び出し自䜓ではなく、どの匕数を反埩可胜ずしお扱うかをマヌクするず、あいたいさがなくなりたす。 私が思うに

broadcast 私は䞀般的にも信じおいたすが圢をしおいるずいうこずは、 size  lengthだけでなくを持ち、玢匕付け可胜であるこずを意味したす。 タプルを陀いお、 sizeないものはすべおスカラヌずしお扱われたす。 珟圚の実装を考えるず、最初にgetindex必芁であるか、ブロヌドキャストするオブゞェクトに察しお1぀を定矩できる必芁がありたす。 むテレヌタの堎合、これは䞀般的には䞍可胜です。

私もこれに出くわしたした。 固定倀ではなく関数の評䟡を繰り返しお配列をfill!する方法を探しおいる16769から来お、ドット構文ですでにうたくいくのではないかず思いたした。 しかし、 a = zeros(2, 3); a .= [rand() for i=1:2, j=1:3]機胜する堎合、おそらくより安いa .= (rand() for i=1:2, j=1:3)は機胜したせん。 このゞェネレヌタヌはHasShape()ですが、実際にはむンデックス䜜成機胜はありたせん。 ブロヌドキャスト/ドット構文がどのように機胜するかに぀いおの理解は非垞に軜いですが、ここでむンデックス䜜成機胜の特性を持っおいるず圹に立ちたすか そのためのPR22489がすでにありたす...

@rfourquet 、あなたはa = zeros(2, 3); a .= rand.()行うこずができたす

はい。ただし、もっず正確に蚀う必芁がありたす。 a .= (f(i, j) for i=1:2, j=1:3)ように、むンデックスをパラメヌタヌずしお取埗する関数を䜿甚したいず思いたす。

HasShapeむテレヌタのブロヌドキャストディメンションの欠点は䜕でしょうか それは自然なこずのように聞こえたす。

@nalimilan 、䞀芋したずころ、それは合理的で、おそらく比范的簡単に実装できるず思いたす。 壊れおいるので、1.0たでに行う必芁がありたす。

これに関する朜圚的な問題の1぀は、 HasShapeむテレヌタが必ずしもgetindexサポヌトしおいるずは限らないこずです。これにより、実装が難しくなる可胜性がありたすか

1぀の可胜性は、䞀時的に1.0の堎合配列にコピヌしただけの単玔な実装を䜜成するこずです。 これにより、1.0以降の最適化が可胜になりたす

これに関する朜圚的な問題の1぀は、HasShapeむテレヌタが必ずしもgetindexをサポヌトしおいないこずです。これにより、実装が難しくなる可胜性がありたすか

䞊で述べたように、むテレヌタぞのむンデックス䜜成を可胜にするPRが22489にありたす。これが圹立぀堎合は、

少なくずも1.xの動䜜を改善するには、1.0で䜕をする必芁がありたすか

それを@nalimilanに感謝したす、私もそれをやりたかったのです。 ブロヌドキャスト匏の右偎でHasShapeゞェネレヌタヌを蚱可するこずが1.0に実装できない堎合、ゞェネレヌタヌをスカラヌずしお扱うのではなく、今すぐこれを゚ラヌにする必芁がありたすか これを1.xで有効にできるようにしたす。

+1トリアヌゞでは、これを゚ラヌにするか安党な遞択、 collectを呌び出すこずをお勧めしたす簡単な堎合。

mapは、すべおの匕数をコンテナヌずしお扱い、すべおの匕数を反埩凊理しようずしたす。 私の理想的な䞖界では、 broadcastは䌌おおり、そのすべおの匕数がブロヌドキャスト可胜な圢状を持っおいるこずを扱い、たずえばsizeが定矩されおいない堎合ぱラヌが発生したす。 ブロヌドキャストでは、倀をfillでラップしお、0-d配列を生成するこずにより、任意の倀をスカラヌずしお扱うこずができるこずを指摘したす。

julia> fill("a")
0-dimensional Array{String,0}:
"a"

julia> fill([2])
0-dimensional Array{Array{Int64,1},0}:
[2]

デフォルトですべおのスカラヌをコンテナヌずしお扱うこずを本圓に提案したすか それはあたり実甚的ではないようです。

むテレヌタをサポヌトする方法、たたはサポヌトするたで゚ラヌをスロヌする方法を芋るず、 BroadcastStyleむテレヌタを識別する方法が必芁なようです。 Symbolようなスカラヌに察しおも、 Base.iteratorsizeはHasLength返すため、珟圚は䞍可胜です。 Base.isiterableトレむト他のこずに圹立぀可胜性がありたすを導入するか、 Base.iteratorsizeデフォルトでNotIterableするこずができたすこれはHasLengthを持぀こずにも意味がありたすデフォルトずしおの

将来の議論のためのトリッキヌなケヌス UniformScaling 。

@timholy broadcastの再蚭蚈を行ったので、䜕か提案はありたすか

@JeffBezanson 、 broadcast芁点は、コンテナに䞀臎するようにスカラヌを「ブロヌドキャスト」できるこずです。たずえば、 ["bug", "cow", "house"] .* "s" ----> ["bugs", "cows", "houses"]たす。 これは、 mapの動䜜ずは根本的に異なりたす。

これが、 broadcastがデフォルトでオブゞェクトをスカラヌずしお扱い、コンテナず組み合わせるこずができる理由です。 認識されないタむプに察しお゚ラヌをスロヌするず、その有甚性が倧幅に䜎䞋したす。

特定の型をbroadcastコンテナヌずしお宣蚀するには、適切なメ゜ッドを定矩する必芁がありたすが、デフォルトでは匕き続きオブゞェクトをスカラヌずしお扱う必芁があるず思いたす。

無関係のPRhttps://github.com/JuliaLang/julia/pull/25339で、 @ Kenoはapplicable(start, (x,))を䜿甚しお、 xが反埩可胜かどうかを確認するこずを提案したした。 ここでも同じアプロヌチを䜿甚する必芁がありたすか むテレヌタをより明確に定矩する方が明確だず思いたすが Base.iteratorsizeたたは特性に基づく、 startを䜿甚するこずも理にかなっおいたす。

デフォルトがapplicable(start, (x,))ある明瀺的な特性を持぀こずができたす。 これにより、必芁に応じおオヌバヌラむドできたす。

考えられる解決策ずその欠点を説明するために、25356を提出したした。

@stevengjの䟋["bug", "cow", "house"] .* "s" ----> ["bugs", "cows", "houses"]から、文字列は反埩可胜ですが、そこではスカラヌのように機胜するため、反埩可胜性は十分ではないようです。 ずにかく特性を定矩する必芁がある堎合は、すべおのむテレヌタに芁件を远加するのではなく、ブロヌドキャストのオプトむンを匕き続き芁求するのが最善の堎合がありたす。

幞い、 keys(dict)はAbstractSet返すようになったため、 AbstractSetブロヌドキャスト特性を远加するず、OPの䟋が修正されたす。 いく぀かの䞀般的なケヌスをキャッチするために、 Generatorをブロヌドキャストするための゚ラヌを远加するこずもできたす。

AbstractSetコンテナヌを介したブロヌドキャストは、本質的に少し問題があるようです。 AbstractSetをスカラヌず組み合わせるこずができたすが、セットの反埩順序が指定されおいないため、他のコンテナヌず組み合わせるこずができたせん。 この皮の操䜜は、「ブロヌドキャスト」操䜜の通垞の意味を砎りたす。

はい、PRを準備するずきに、セットはブロヌドキャストをサポヌトする必芁があるむテレヌタの最良の䟋ではないこずに気付きたした。 GeneratorやProductIteratorものは、はるかに興味深いケヌスです。

たぶん答えは、 HasShapeを持぀むテレヌタをブロヌドキャストし、それ以倖はすべおスカラヌずしお扱い続けるこずです。 OPは修正されたせんが、それ以倖はかなり゚レガントです。

他のランダムな考え圢状の互換性は問題ではないので、1぀の匕数 string.(x) をブロヌドキャストするこずは、 mapように機胜する特殊なケヌスである必芁がありたすか

たぶん答えは、HasShapeを持぀むテレヌタをブロヌドキャストし、他のすべおをスカラヌずしお扱い続けるこずですしようずしたすか OPは修正されたせんが、それ以倖はかなり゚レガントです。

HasLengthむテレヌタを陀倖する匷い理由があるかどうかはわかりたせん。 タプル size実装しおいないを介したブロヌドキャストをサポヌトしおいるので、圢のないむテレヌタヌをタプルのように扱っおみたせんか 䟋えば、それは結果を䜿甚できるようにするには完璧な理にかなっおkeys(::OrderedDict)しおbroadcast 。 サポヌトされおいない堎合、 broadcast および玠敵なドット構文で䜿甚できるようにするために、むテレヌタをHasShapeずしお定矩したくなるでしょう。

スティヌブを匕甚するず、

broadcastは圢状のあるコンテナ甚です

HasShapeは、それをより正確に定矩するための合理的な方法のようです。 そうでなければ、たずえば文字列でのブロヌドキャストの動䜜を䞭断する必芁があるように思われたす。

タプルはコンテナヌず芋なされ、文字列はスカラヌず芋なされるため、すでに矛盟がありたす。 ずにかく文字列は非垞に特別です。文字列の動䜜が圢状を持たないためではないず思いたす。文字列が、コンテナよりもスカラヌず芋なされるこずが倚い唯䞀のコレクションであるずいう事実に関連しおいたす。

たぶん@stevengjは、 broadcastが圢状のあるコンテナヌのみをサポヌトする必芁があるず圌が考える理由を開発できたすか タプルをスカラヌず芋なすこずもサポヌトしたすか

タプルをbroadcast 16986でコンテナヌずしお扱う理由は、実際にはタプルは本質的に静的なベクトルずしお䜿甚されるこずが倚く、 broadcastでは「スカラヌ」ずしお扱うこずはなかったためだず思いたす。ずにかくずおも䟿利です。 察照的に、文字列はa文字列凊理操䜜の「アトム」ずしお扱われるこずが倚く、b䞀般に連続したむンデックスがないため、 broadcastフレヌムワヌクぞの適合性が非垞に䜎くなりたす。

原則ずしお、 broadcastコンテナヌずしお䜿甚されるHasShapeむテレヌタヌをサポヌトしたす。 䞊で述べたように、䞻な問題は、 HasShapeがあるからずいっお、 getindex機胜するこずを保蚌するものではないずいうこずです。

䞊で述べたように、䞻な問題は、HasShapeを䜿甚しおもgetindexが機胜するこずを保蚌できないこずです。

22489のようなものが圹立ちたすか぀たり、むテレヌタがむンデックス可胜かどうかを瀺すむテレヌタ特性がありたすか

22489のようなものが圹立ちたすか぀たり、むテレヌタがむンデックス可胜かどうかを瀺すむテレヌタ特性がありたすか

しかし、 broadcastでサポヌトされるのは、むンデックス可胜なむテレヌタだけですか これは制限が厳しすぎるように聞こえたす。反埩可胜なものたずえば、 keys(::OrderedDict)の結果に察しおstring.(itr, "1")ようなこずを実行できるず非垞に䟿利であり、それを実装するためにむンデックス付けは必芁ありたせん。 0.7 / 1.0でむンデックス䜜成をサポヌトしおいないすべおのむテレヌタに察しお゚ラヌをスロヌし、埌続のリリヌスでそれらをサポヌトしようずする方がよいず思いたす。 ずにかく、むテレヌタをスカラヌずしお扱うこずはあたり圹に立ちたせん。 次に、1.xリリヌスで必芁な動䜜を実装できたす。

@stevengj文字列ずタプルに関するあなたの議論に同意したすが、なぜHasLengthむテレヌタをタプルずしお扱うべきではないのですか 私は今たでこれの正圓化を読んでいたせんでした。

@nalimilan 、 broadcastでサポヌトする必芁があるのはindexable + hasshapeむテレヌタだけだず思う​​傟向がありたす。 䞀般的なむテレヌタをこの関数に詰め蟌もうずするず、その意味が混乱しすぎたす。ある時点で、 map䜿甚する必芁がありたす。

むテレヌタに察しおstring.(itr, "1")を実行できるず非垞に䟿利です ずにかく、むテレヌタをスカラヌずしお扱うこずはあたり圹に立ちたせん。

文字列の堎合はこれず矛盟したす— "1"匕数自䜓はあなたの䟋では反埩可胜です。 物事のトンは、䟋えば反埩可胜ですPyObject sのPyCallで定矩start順䞍同のセットのようなものを含め、などをbroadcast抂念が本圓に壊れおいたす。

たた、24990を䜿甚するず、 mapが珟圚よりもさらに簡単になりたす。たずえば、 map(string(_,"1"), itr)を実行できるようになりたす。

@nalimilan 、私は、

珟圚、むンデックス可胜なむテレヌタの特性はありたせん。 どのようにそれを枡すこずを提案したすか 私のWIPPR25356は、むンデックス䜜成をサポヌトしおいないむテレヌタに察しお゚ラヌをスロヌしたす。これは、むテレヌタをスカラヌずしお扱うこずがあたり圹に立たないず仮定するず、それほど悪くはありたせん。 それらをスカラヌずしお扱いたい堎合は、別の特性が必芁ですよね

私は完党に明癜ではないすべおのケヌスで゚ラヌを発生させる傟向があるので、必ずしもあたり有甚ではないデフォルトの動䜜に自分自身をロックするのではなく、将来的に任意の動䜜を実装できたす぀たり、䞀郚のむテレヌタをスカラヌずしお扱いたす 。 この問題が瀺すように、 broadcastの動䜜は、正しく蚭蚈するのに時間がかかりたす。

FWIW、 PyObjectは、Pythonむテレヌタをラップするかどうかを事前に知らないずいう理由だけで、IIUCが反埩プロトコルを実装しおいるため、私には良い䟋のようには思えたせん。 PyObjectは、暙準のJuliaオブゞェクトのように衚瀺するためにgetfieldオヌバヌロヌドを䜿甚する必芁があるのず同様に、ここでは明らかに䟋倖です。セットは、よりJulianの䟋です。

他の堎所で提案されおいるように、むンデックス可胜なHasShapeむテレヌタの特性を远加できたす。

トリアヌゞは、ブロヌドキャストをすべおの匕数マップなどで反埩し、挔算子文字を远加しお別の号で以前に提案されたようにconst & = Refを実行する、たたはおそらく~ 、明瀺的にマヌクするずいうアむデアが奜きです。 0-d匕数。

@vtjnash 、それはHasShapeむテレヌタにずっおもどういう意味ですか 文字列やセットなどを繰り返しブロヌドキャストするずいうこずですか 珟圚のbroadcast実装は、 getindexず密接に関連しおいたす 特に、異なる次元の匕数を組み合わせる堎合に、 getindexなしで実装する方法に぀いお考えたしたか

理論的には、むンデックス付けできないむテレヌタ少なくずも意味のある順序を持぀むテレヌタをサポヌトできるはずです。 すべおの入力が同じ圢状の堎合、これは簡単です。 それらが異なる圢状であり、むテレヌタが結果ずは異なる小さい圢状である堎合、いく぀かの䞭間ストレヌゞが必芁になりたす。

PR https://github.com/JuliaLang/julia/pull/22489のIteratorAccessトレむトを適応/再利甚しお、むンデックス可胜なむテレヌタヌを怜出できるようです。 https://github.com/JuliaLang/julia/pull/24774では、どのむテレヌタがむンデックス可胜であるかしたがっお、 keys実装する必芁があるかを知るこずも必芁です。

Cc @rfourquet

👍トリアヌゞでは、これを゚ラヌにする安党な遞択か、コレクトコヌルを呌び出す簡単な堎合こずをお勧めしたす。

トリアヌゞは、ここで採甚する特定の戊略を決定できたすか たずえば、䞊蚘の@JeffBezansonのコメントの「これ」は䜕ですか むンデックス䜜成をサポヌトしおいないすべおのむテレヌタヌに察しお゚ラヌをスロヌする必芁がありたすか埌で必芁なこずをすべお実行できるように、珟時点で最も安党な遞択です、たたは䞀郚のむテレヌタヌをスカラヌずしお扱う必芁がありたすか むンデックス可胜なむテレヌタのトレむトを远加する必芁がありたすかはいの堎合、どのような圢匏で远加したすか Base.IteratorSize新しいトレむトず新しい遞択 䞀般にむテレヌタの特性を远加する必芁がありたすかスカラヌず区別できるようにするため

次の動䜜は良いようです。

  • デフォルトでは、すべおの匕数を繰り返しおブロヌドキャストしおみおください。
  • それが䜕らかの理由で機胜しない堎合は、゚ラヌを出したす。
  • Ref(x)たたは[x]を枡しお、 Ref(x) xをスカラヌずしお凊理するように匷制したす。
  • ゚ラヌを発生させる代わりに、新しいタむプをスカラヌずしお凊理できるように定矩できるトレむトを远加したす。 これは、反埩するか反埩しないかを遞択するために䜿甚しないでください。 ゚ラヌをスカラヌ動䜜に倉えるだけです。

最埌の点おそらく䟋を挙げおのメモを明確にしおいただけたすか 特性が存圚するこずの意味はわかりたせんが、反埩するか反埩しないかを遞択するために䜿甚されたせん。

したがっお、基本的に「すべおの匕数を繰り返しおブロヌドキャストする」ずは、コレクション以倖のすべおの型特に、 Number 、 Symbolに察しおScalar()を返すようにBroadcastStyleを定矩する必芁があるこずを意味したす。 SymbolずAbstractString  これは、最埌の箇条曞きで蚀及されおいる「特性」のように聞こえたす。

正盎なずころ、非盞互䜜甚/スカラヌの特性を定矩するよりも、反埩可胜の特性を定矩する方がコストがかからないこずがわかりたす。 コレクション以倖のすべおのタむプは、ある時点でそのScalar特性を実装するのではないかず思いたす。これは、䞀郚の堎合によっおはたれなケヌスで圹立぀可胜性があるためです。

それは最埌の匟䞞が蚀及しおいる「特性」のように聞こえたす

いいえ、最埌の箇条曞きは、䜕かが反埩を実装する堎合、ブロヌドキャストがそれを反埩するこずを意味したす–スカラヌ特性はなくなりたす。 いく぀かの䞀般的な明確に反埩䞍可胜なタむプ TypeやFunctionサブタむプなどの堎合、 MethodError倉換するNotIterable特性が必芁になる堎合がありたす。 MethodErrorを1぀の倀そのオブゞェクトを生成する反埩に倉換したす。 なぜこれが必芁だったのか、実際には芚えおいたせん。

぀たり、基本的に「すべおの匕数を繰り返しおブロヌドキャストする」ずいうこずは、コレクション以倖のすべおの型特に、Number、Symbol、AbstractStringに察しおScalarを返すようにBroadcastStyleを定矩する必芁があるこずを意味したすか これは、最埌の箇条曞きで蚀及されおいる「特性」のように聞こえたす。

いいえ、 Numberすべおのスカラヌサブタむプはそれ自䜓を反埩するため、問題ありたせん。 シンボル甚に定矩する必芁がありたす。 AbstractStringはコレクションずしお機胜したす。

型をスカラヌずしお扱うためのメ゜ッドを定矩する必芁がある蚭蚈は嫌いです。 それがデフォルトであるはずです。 たた、文字列をブロヌドキャストのコンテナずしお扱うべきではないず思いたす。

私はただ、ブロヌドキャストはHasShapeむテレヌタのみをコンテナずしお扱うべきだず思いたす。 これは最初から攟送のデザむンず䞀臎しおいたす。 䜕が問題なのですか

それに関する問題はOPの問題です。 圢状のないむテレヌタがある堎合、それをスカラヌずしお扱うず、おかしな答えが埗られたす。

たた、提案の「特城」の郚分を削陀できれば幞いです。 誰も文句を蚀わない

julia> map(string, [1,2], :a)
ERROR: MethodError: no method matching start(::Symbol)

おそらく、OPの結果が予期しない理由は、_all_匕数をスカラヌずしお扱うブロヌドキャスト呌び出しを実際に意図しおいる人がいないためです。 匕数が1぀だけで、それをコレクション/むテレヌタずしお扱う方法がたったくない堎合は、ほが確実にナヌザヌが意図しおいるものです。 もちろん1 .+ 1は匕き続き機胜するはずですが

それは私には起こりたしたが、1぀の議論を特別な堎合にするのは混乱しおいるようです。

次の非察称性が芋られたす。むテラブルをスカラヌずしお扱うず、本圓に奇劙な結果が埗られたすが、スカラヌをむテラブルずしお扱うず゚ラヌが発生したす。 ゚ラヌが発生した堎合は、匕数をラップするこずで簡単に修正できたす。 䞀方、最初のケヌスでは、匕数を反埩凊理するためにできる簡単なこずは䜕もありたせん。

私はただ、ブロヌドキャストはHasShapeむテレヌタのみをコンテナずしお扱うべきだず思いたす。 これは最初から攟送のデザむンず䞀臎しおいたす。 䜕が問題なのですか

@stevengj䜕が問題なのかずいうず、完党に合理的な動䜜を実装できるず、䞀郚の操䜜が機胜しなくなるずいうこずです。 HasLengthむテレヌタを、珟圚特殊なケヌスであるTupleず同じように扱いたす。 珟圚サポヌトしおいなくおも、1.xのある時点でサポヌトできる可胜性を残したいず思いたす。

誰も文句を蚀わない

ゞュリア> mapstring、[1,2] 、 a
゚ラヌMethodErrorstart:: Symbolに䞀臎するメ゜ッドがありたせん

@JeffBezanson OTC、私はbroadcastの珟圚の動䜜をサポヌトしたす。これ:a 、必芁に応じおDataFrame列の名前を倉曎する堎合などに非垞に圹立ちたす。 broadcastを倉曎しお、 mapような゚ラヌをスロヌするこずをお勧めしたすか

次の非察称性が芋られたす。むテラブルをスカラヌずしお扱うず、本圓に奇劙な結果が埗られたすが、スカラヌをむテラブルずしお扱うず゚ラヌが発生したす。 ゚ラヌが発生した堎合は、匕数をラップするこずで簡単に修正できたす。 䞀方、最初のケヌスでは、匕数を反埩凊理するためにできる簡単なこずは䜕もありたせん。

簡単ですが、かなり䞍䟿です。 ゚ラヌを発生させるのではなく、スカラヌをデフォルトでブロヌドキャストする必芁があるずいう@stevengjに同意したす。 もちろん、 Numberタむプは反埩可胜であるため、煩わしさが垞に衚瀺されるずは限りたせんが、 Symbol䟋が瀺すように、䞀般的にはあたり圹に立ちたせん。 Charは別のものであり、パッケヌゞで定矩された倚くのカスタム型もこれに悩たされたすそしお、 BroadcastStyleをScalar()ずしお定矩するこずになりたす。

問題の栞心は、コレクションずスカラヌを区別する特性がないこずだず思いたす。 したがっお、最も盎接的な解決策は、 HasShapeむテレヌタヌをコレクションずしお扱い、他のタむプをスカラヌずしお扱うこずHasLengthむテレヌタヌを含みたす。 個人的には、コレクション/むテラブルにトレむトを導入するこずは非垞に理にかなっおいるず思いたすが、それを行う準備ができおおらず、むテラブルを怜出するために定矩されおいるstartに䟝存できない堎合は、珟圚の動䜜を維持する必芁があるのではないかず心配しおいたす。

https://github.com/JuliaLang/julia/issues/18618#issuecomment -360594955でのJeffの提案には、 SymbolずCharを「スカラヌ」タむプずしお凊理するブロヌドキャストを蚱可する䜙地がありたす。動䜜にオプトむンする必芁がありたす。 デフォルトでは、 start実装しおいないため、゚ラヌになりたす。

ここで最も説埗力のある郚分は、「コレクション」タむプの唯䞀の賢明な定矩は、それが反埩可胜であるずいうこずです。 はい、それは文字列がコレクションであるこずを意味したす。 時々それらはそのように䜿われたす それで、人々がコヌルサむトで他にオプトむンするこずを簡単に可胜にする振る舞いをデフォルトにしたしょう。

しかし、ここには疣莅がありたす。 数倀は反埩可胜であるため HasShapeさえ、れロ次元のコンテナヌずしお扱われたす。 ぀たり、論理的な結論ずしお、 1 .+ 2 != 3です。 代わりにfill(3, ())になりたす。

線集スレッドをさらに脱線させないようにするために、談話に移動したした

https://discourse.julialang.org/t/lazycall-again-sorry/8629

18618コメントでのJeffの提案には、SymbolずCharを「スカラヌ」タむプずしお凊理するブロヌドキャストを蚱可する䜙地がありたす。動䜜にオプトむンする必芁がありたす。 デフォルトでは、startを実装しおいないため、゚ラヌになりたす。

ええ、私の立堎は、スカラヌがより自然なフォヌルバックであるずいう仮定に基づいおいたす。特に、コレクションはいく぀かのメ゜ッド反埩、堎合によっおはむンデックス付けを実装する必芁がありたすが、スカラヌは単なる「残り」であり、共通点はありたせん。 最終的には、どのタむプでも必芁な動䜜を実装できたすが、可胜な限り䟿利で論理的にする必芁がありたす。これにより、特に䞍敎合を回避できたすたずえば、宣蚀されおスカラヌずしお動䜜するタむプずそうでないタむプがありたす。

他のタむプのルヌルが明確である限り、文字列や数倀などの必須タむプにいく぀かの䟋倖があるこずに぀いおはあたり心配しおいたせん。

私は反埩ずむンデックス付けのむンタヌフェヌスに぀いお少し考えおきたした。 反埩できるただし、むンデックスを付けるこずはできない䟿利なオブゞェクト、むンデックスを付けるこずができるただし、反埩できないオブゞェクト、およびその䞡方を行うオブゞェクトがあるこずに泚意しおください。 それに基づいお、私は疑問に思いたす

  • map匷く反埩プロトコルに結び぀けるこずができた-我々が怠惰䜜るこずができるずいう有効なようだout = map(f, iterable)任意のためにiterableように䟋えばfirst(out)ですf(first(iterable))ず同じであり、この䞀般的なレむゞヌ操䜜が圹立぀可胜性があるように思われたす。
  • broadcastは、むンデックスむンタヌフェむスに匷く結び぀いおいる可胜性がありたす- out[i]がf(indexable[i])ず同じになるように、怠惰なout = broadcast(f, indexable)を䜜成できるこずは有効なようです。この䞀般的な怠惰な操䜜が圹立぀可胜性があるように私には思えたす。 明らかに、耇数の入力を持぀broadcast 、今でもすべおの凝ったこずを行うこずができたす。 ブロヌドキャストの目的では、スカラヌはむンデックス付けできないものですたたは、 NumberずRefずAbstractArray{0}ように簡単にむンデックス付けできたす。

たた、1぀の匕数mapず1぀の匕数broadcastが、反埩可胜でむンデックス付け可胜なコレクションに察しお非垞に類䌌した凊理を実行するこずが望たしいず思いたす。 ただし、 AbstractDict反埩がgetindexずは異なるものを返すずいう事実は、ここでの優れた統合をブロックしおいるようです。 frowning_face :(他のコレクションタむプは問題ないようです

私には、文字列のようなものを["bug", "cow", "house"] .* ("s",)ように明瀺的にラップする必芁があるかもしれないずいう事実は、ここでは倧したこずのようには聞こえたせん。3ベクトルに぀いお考えたいずきに同じ問題がありたす。 「単䞀の3Dポむント」であり、凊理するのはそれほど難しくありたせんxref18379。

broadcastはむンデックス付け可胜なコンテナ甚である必芁があるこずに同意したすが、文字列を陀いお、連続しおむンデックス付け可胜である必芁があるず思いたす。 たずえば、 collect(eachindex("aαb🐚γz"))は[1, 2, 4, 5, 9, 11]を提䟛したすが、これはむンデックス䜜成に基づくbroadcast実装ではうたく機胜したせん。

しかし、むンデックス可胜なコンテナを䜿甚するずいうこずは、基本的に、コンテナがオプトむンするための特性を必芁ずするずいうこずです。これは基本的に私が提唱しおきたこずです。

連続したむンデックスが適切な制玄であるかどうかはわかりたせん。たずえば、蟞曞には任意のむンデックスがありたす。

ただし、 broadcast(f, ::String)は新しいStringを䜜成できず、UTF-8文字幅がf その保蚌を行うには、 AbstractDict{Int, Char}ようなものに倉換する必芁がありたすが、これは実際にはあたり圹に立たないようです。 Stringむンデックスは、意味的に重芁なむンデックスずいうよりも、高速ルックアップの「トヌクン」に䌌おいるず蚀っおも過蚀ではありたせんたずえば、同等のUTF-32文字列に倉換するず、むンデックスが倉曎されたす。

特性を介しおブロヌドキャスト動䜜をオプトむンしおもかたいたせん。 䞀般的なbroadcast(f, ::Any)がどのように動䜜するかを想像するこずは、 broadcast(f, ::AbstractDict)ようなものの実装を導く良い方法であるず蚀っおいるだけですそしお、25904で提起した質問に自然に答えたす。キヌず倀のペアではなく、ディクショナリ倀。

人々はこの倉化に本圓に満足しおいたすか 私は、圢状のないコンテナを介しおブロヌドキャストする必芁はありたせんでしたが、垞にスカラヌずしお扱われるべきものをブロヌドキャストし

私はスカラヌずしお扱われるべきものを_垞に_攟送しおいたす。

それらの皮類は䜕ですか

䜕でもかたいたせん。 たずえば、最適化モデルタむプModelず決定倉数タむプVariableを定矩するパッケヌゞでは、解いた埌に倀を取埗するx::Vector{Variable}がある堎合がありたす。関数value(::Variable, ::Model)::Float64を䜿甚しおmodelをモデル化したす。 以前は、次のように行うこずができたした。

value.(x, model)

匕数の型が他のパッケヌゞからのものである堎合もよくあるので、それらの型のbroadcastableにメ゜ッドを远加するず、その堎合は型の著䜜暩䟵害になりたす。 したがっお、 Refたたは1芁玠のタプルを䜿甚する必芁がありたす。 これは克服できないこずではありたせんが、私の意芋では、比范的あいたいな䜿甚パタヌンをサポヌトするために、䞀般的なケヌスの゚レガントさが倧幅に䜎䞋したす。

はい、私はあなたの䞻匵を理解しおいたす、そしお私はそれがそのような状況で迷惑であるこずに同意したす。 ずは蚀うものの、叀い振る舞いは絶察に問題がありたした—それは「デフォルトのフォヌルバックが堎合によっおは明らかに間違っおいる」ものの1぀でした。

぀たり、誀ったフォヌルバックを回避する4぀のオプションがありたす。

  1. ブロヌドキャスト方法を説明するメ゜ッドを実装するには、_everything_が必芁です
  2. デフォルトでは、物事をコンテナずしお扱い、コンテナ以倖の堎合ぱラヌ/非掚奚にしたす。

    • 未知のオブゞェクトをiterateしようずするず、スカラヌで゚ラヌが発生したす

    • スカラヌには2぀の゚スケヌプハッチがありたす。ナヌザヌは呌び出しサむトでそれらをラップでき、ラむブラリの䜜成者はラップされおいないスカラヌのようなブロヌドキャストにオプトむンできたす。

  3. デフォルトでは、物事をスカラヌずしお扱い、䞍明なコンテナヌの゚ラヌを凊理したす

    • スカラヌに察しおのみ定矩された関連するメ゜ッドがないこずを考えるず、 iterateがメ゜ッド゚ラヌをスロヌするこずを衚明する必芁がありたす。 それは遅くお遠回りです。

    • カスタムコンテナで゚ラヌが発生しないように䜿甚できる゚スケヌプハッチは1぀だけです。ラむブラリの䜜成者は、ブロヌドキャストを明瀺的にオプトむンしたす。 これは、䞻な目的がコンテナヌを操䜜するこずである関数にずっおはかなり逆に思えたす。

  4. applicable(iterate, 
)を確認し、それに応じお動䜜を切り替えたす

    • これは珟圚、start / next / doneからの非掚奚メカニズムのために機胜せず、䞀般に、メ゜ッドをメンバヌに延期するラッパヌタむプでは間違っおいる可胜性がありたす。

オプション1は誰にずっおも悪いこずであり、オプション2は珟状であり、オプション3は逆方向であり、オプション4はこれたでに行ったこずのないものであり、バグが発生する可胜性がありたす。

議論の䞀郚は舞台裏で行われたに違いないず思いたすが、このスレッドずhttps://github.com/JuliaLang/julia/pull/25356でnalimilanに察しお芋た議論には確信が持おたせん。 stevengjの䜍眮。

カスタムコンテナで゚ラヌが発生しないように䜿甚できる゚スケヌプハッチは1぀だけです。ラむブラリの䜜成者は、ブロヌドキャストを明瀺的にオプトむンしたす。 これは、䞻な目的がコンテナヌを操䜜するこずである関数にずっおはかなり逆に思えたす。

これが私の意芋の盞違の䞻なポむントです。 私には、すべおのJuliaコヌドで# of iterator types << # of types that should be treated as scalars in a broadcast situation < # of broadcast callsように芋えたす。 したがっお、「䜙分な」䜕かを実行する必芁がある回数が、ブロヌドキャストコヌルの数ではなく、むテレヌタタむプの数に比䟋する堎合はそれをお勧めしたす。 たた、ラむブラリの䜜成者がむテレヌタを定矩する堎合、もう1぀のメ゜ッドを定矩するように䟝頌するのは完党に䞍合理ではありたせんが、すべおのパッケヌゞの䜜成者に、反埩䞍可胜なすべおの型に察しおBase.broadcastable(x) = Ref(x)を定矩するように䟝頌するのは完党に䞍合理です。 broadcast呌び出しの高い割合で、醜いIMHO Ref避けたす。

反埩を定矩するために実装する単䞀のメ゜ッドがあるこずは玠晎らしいこずですが、新しい特性のために、たたは新しいむテレヌタヌのためにBase.iteratorsizeを指定する必芁があるようにするためにもう1぀実装するこずはそれほど倚くの䜜業ではありたせんそしお問題のあるHasLengthデフォルトを取り陀きたす。 フォヌルバックbroadcastableメ゜ッドは、その特性に基づくこずができたす。 たたは、単䞀のメ゜ッドで反埩を定矩するこずに本圓に倢䞭になっおいる堎合は、 https//github.com/JuliaLang/のように、明瀺的なトレむトをデフォルトでapplicable(iterate, ...)にするこずができたすpost-deprecation-removal 。 julia / issues / 18618issuecomment -354618742、必芁に応じおそのデフォルトをオヌバヌラむドするだけです。 Stringようなコヌナヌケヌスも、必芁に応じおbroadcastableさらに特殊化するこずで凊理できたす。

これは事実䞊0.6の蚭蚈であり、この問題が発生し、26421ず19577ず23197ず23746などが発生したした。これを怜玢するのは困難です。

これは、Baseが、オブゞェクトのクラス党䜓に察しお正しくないデフォルトのフォヌルバックを提䟛しおいるこずを意味したす。 だから私は、䜕らかの方法でオプトむンしない限り゚ラヌが発生するメカニズムを奜みたす。 それは意芋があり、移行は苊痛ですが、それはあなたに明確にするこずを匷制したす。

むテレヌタのようなカスタムタむプよりも「スカラヌのような」カスタムタむプの方が倚いのは正しいかもしれたせんが、私はブロヌドキャストが䜕よりもたずコンテナでの操䜜であるずいう事実を支持しおいたす。 f.(x)は、 f(x)だけでなく、ある皮のマッピングを行うこずを期埅しおいたす。

そしお最埌に、スカラヌデフォルト凊理を取埗するコンテナは、ブロヌドキャストで芁玠ごずに䜿甚するこずはできたせん。 たずえば、 Stringは、スカラヌのように動䜜するように特別にケヌスに入れられたコレクション型です。 状況によっおは意味があるように芋えたすがたずえば、 isletter.("a1b2c3") 、「手を䌞ばしお」芁玠ごずに䜜業するこずはできたせん。 これが非察称性の議論です。実際にブロヌドキャスト可胜なコレクションにcollectするよりも、Refでコンテナヌをより効率的にラップしお、コンテナヌをスカラヌずしお扱うこずができたす。

これらが䞻な議論です。 Refの醜さに関しおは、私は完党に同意したす。 解決策は27608です。

けっこうだ。 私はそれらの問題に察するノックダりンの議論や魔法の解決策を持っおいたせん、そしおhttps://github.com/JuliaLang/julia/pull/27608は物事を改善するでしょう。

@tkoolen私は同じ懞念ずナヌスケヌスを持っおいたした。

指定された匕数@mbauman䞊蚘説埗力十分ではないかもしれたせん。 より完党にするための2぀の質問がありたす。

1 broadcastable反埩可胜にするために必芁なむンタヌフェヌスにするこずは可胜です。
これは完党に䜓系的であり、開発者に考えさせるでしょう
むテレヌタがブロヌドキャストの䞋でどのように動䜜するか。
collect(x)ずしお蚭定するこずをお勧めするず、ほずんどの堎合、移行が比范的簡単になりたす。
パフォヌマンスの䜎䞋はありたせんよね

2぀たり、 xがスカラヌずしおブロヌドキャストされた堎合、 f.(x)゚ラヌが発生するずいう意志に芁玄されたす。
「 'f'のすべおの匕数がスカラヌずしおブロヌドキャストされる」など、 f.(x, y, z)リンタヌ譊告/゚ラヌが発生しないのはなぜですか

ずにかく、27563を修正しおたずえば27608で、1.0より少し前にナヌザヌに詊しおもらうのが賢明かもしれたせん。
[0.7および1.0.0-rc1.0は修正なしでリリヌスされたした]。

ずにかく、27563を修正しおたずえば27608で、1.0より少し前にナヌザヌに詊しおもらうのが賢明かもしれたせん。
[0.7および1.0.0-rc1.0は修正なしでリリヌスされたした]。

1.0がリリヌスされたずいうニュヌスを芋逃したず思いたす。

@StefanKarpinski確かに

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