@juliantaylorは、パンダの問題でこれを提起しました。
チケットの例:
import numpy as np
import random
random.sample(np.array([1,2,3]),1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/user1/py33/lib/python3.3/random.py", line 298, in sample
raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
TypeError: Population must be a sequence or set. For dicts, use list(d).
これは、3.3では1.7.0rc1.dev-3a52aa0で、3.2では1.6.2で発生します。
もちろん、2.7は影響を受けません。
cpython / Lib / random.py:297からの関連コード
from collections.abc import Set as _Set, Sequence as _Sequence
def sample(self, population, k):
# ...
if not isinstance(population, _Sequence):
raise TypeError("Population must be a sequence or set. For dicts, use list(d).")
同様のテストでstdlib内の別の場所をgrepできませんでしたが、lib2to3
想定される同等性を示しました:
lib2to3/fixes/fix_operator.py
5:operator.isSequenceType(obj) -> isinstance(obj, collections.Sequence)
2.7で
In [6]: operator.isSequenceType(np.array([1]))
Out[6]: True
しかし3.3 / 3.2では
>>> isinstance(np.array([1]), collections.Sequence)
False
Python 3.xは、Python 2.xよりもrandom.sample
でより厳密なチェックを実行するだけです。 2.xでは、numpyもSequenceサブクラスではありません(ndarrayにはindex
、 count
または__reversed__
メソッドがありません)。 したがって、これはrandom.sample
誤用、またはPython3.xによる下位互換性の侵害と見なすことができると思います。
十分に公平ですが、そうは言っても、シーケンスを簡単に_make_ndarrayすることができます。
これらの方法はすべて理にかなっており、
実装します。 実際、Sequenceはそれを継承するだけで十分です。
不足しているすべてのメソッドをミックスインとして提供します。
2012年12月2日13:30、「RalfGommers」 [email protected]は次のように書いています。
Python 3.xは、random.sampleでより厳密なチェックを実行するだけです。
Python2.x。 2.xでは、numpyもSequenceサブクラスではありません(ndarrayには
インデックス、カウント、または逆の方法)。 だから私はあなたがこれを次のように見なすことができると思います
random.sampleの誤用、または下位互換性の破綻
Python3.x。—
このメールに直接返信するか、Gi tHubhttps://github.com/numpy/numpy/issues/2776#issuecomment-10929601で表示してください。
これをより微妙にする2to3の例がなかったら、私は同じことを言っただろう。
インデックスとカウントは必要ないと私は信じています:リンク、
Sequence
すべての抽象メソッドはすでに実装されており、その他にはデフォルトの実装があります。
問題は、 MutableSequence
が実際にはより正確であり、 insert
が実装されていないことです。
0-d配列を忘れないでください。今、それらがどうなるかはわかりませんが、実際にはシーケンスではありませんか?
うーん、 Sequence
は不変オブジェクトを対象としています。 MutableSequence
(extend、pop)のメソッドのいくつかは意味がありません。 そうです、これら3つの方法を追加することはできますが、それは完全に正しくないと感じています。
random.sample
がSequence
インスタンスを必要とする理由は実際にはないように
__setitem__
は実装されていますが、 __delitem__
__setitem__
は実装されていないので、おそらくSomewhatMutableSequence
?
インターフェイスを「シーケンスにはこれらすべてが含まれている必要がありますが、一部のシーケンスにはこれらが含まれている必要がある」と解釈するのは理にかなっています。
ひどいO() "を持っているので、いくつかのメソッドの素朴な実装を提供しています。
確かに、ndarrayのコンテキストで不明確なのは、 insert
、 pop
のセマンティクスではありません。
ただし、0-d配列での反復に関して正しいことが何であるかはわかりません。
TypeError
ではなく__iter__
メソッドを提供すると主張する人もいるかもしれません。
StopIteration
はとにかくダックタイピングの違反です。
編集:それは不注意な決定ではなかったと確信していますが。
ndarrayは単なるシーケンスである可能性があります。これは、不変でなければならないという意味ではありません。
ところで。 CPythonリストの実装も効率的な挿入、ポップ、拡張をサポートしていませんが、それでもMutableSequenceです
ndarrayはインプレース挿入/ポップ/拡張をサポートできないため(ndarrayのサイズは固定されています)、可変シーケンスですが、Python MutableSequence
ありません(決してサポートされません)。 ただし、 Sequence
インターフェイスをサポートできます。
random.sample
がこれをチェックしなかったとしたらいいのですが、よく見ると、もっともらしい理由があります。さまざまなタイプの入力引数に対してさまざまな実装があるため、何らかの方法が必要です。それらを区別するために。 インデックス作成を開始して、最高のものを期待することはできません。 バグを報告して、認識されない型のデフォルトでシーケンスの実装にフォールバックするように説得することもできますが、最も早く役立つのは3.4です...
ただし、0-d配列についてのポイントは良いものです。 0-d配列はSequence
インターフェイスをサポートしていません( Iterable
もサポートしていません)。 しかし、Pythonの目的では、 Sequence
ことに嘘をつき、実際のアクセスでエラーが発生するのを待つのはそれほどひどいことではありません。ダックタイピングは、必要に応じていつでも失敗できることを意味します:-)。 多次元配列ではisinstance(a, Sequence)
成功させ、0次元配列では失敗させる可能性があります。 それを実現できればクールです。 しかし、最善の方法ができない場合でも、おそらくndarrayをSequence
することです。
MaskedArrayにはすでにcount
メソッドがあるため、ndarrayに何か別のことを行うメソッドを追加すると、それが壊れることに注意してください。
0-D配列は、いくつかの便利なメソッドを備えたスカラーとしてより適切に考えられます(少なくともそれが私がそれらを考える方法です)。 反復可能ではないことに加えて、インデックス付けもできません。これは、配列と考えるとさらに奇妙です。 したがって、0-D配列をさらに別の方法で不整合にすることは、大きな問題ではありません。
@njsmith複数の実装はどこにありますか? isinstance(Sequence)チェックの後、 len(population)
と、リストへの変換のみが表示されます。 http://hg.python.org/cpython/file/22d891a2d533/Lib/random.py
Pandas SeriesタイプとDataFrameタイプにも、互換性のないcountメソッドとindex属性があります。
@rgommers :うーん、その通りです。エラーメッセージに惑わされ、 range()
省略形として整数も受け入れられると思いましたが、受け入れられませんでした。 それでも、セット、シーケンス、およびマッピングに対して異なる動作を定義したいと考えています。 たぶん私たちは彼らにそれを切り替えるべきだと彼らに納得させることができます
if isinstance(population, _Set):
population = tuple(population)
if isinstance(population, _Mapping):
raise Blarrrgh()
# Otherwise assume that we have a sequence and hope
これは、既存のndarrayサブクラスについての良い点でもあります。 ndarrayがSequence
と言う方法はないようですが、そのサブクラスはそうではありません:-(。したがって、これらのサブクラスの一部がSequence
満たすことができないことを考えると、どちらのオプションが最も悪いかはわかりません。互換性を損なうことなく
Sequence
互換のバージョンに置き換えます。 これはcount
メソッドで実行できるようですが、 Series.index
の名前を変更すると、パンダの人々にとって非常に混乱を招きます。 (DataFrameはndarrayのサブクラスではないため、技術的には関係ありません。ただし、SeriesとDataFrameの同期を維持する必要があると思います。) @ wesmに彼の考えを尋ねることができると思いますが、...Sequence
定義を満たすようにndarrayとそのサブクラスを宣言し、一部のndarrayサブクラスではこれが嘘になることを受け入れます。 ただし、 Sequence
インターフェイスのめったに使用されない部分でのみ、Pythonタイプは通常とにかく嘘をつきます...class multidim_ndarray(ndarray, Sequence):
pass
代わりに、このクラスのmulti-dim配列インスタンスを作成します。 サブクラスは、 multidim_ndarray
ではなくndarray
から継承し続けるため、影響を受けません。 もちろん、単一のndarrayオブジェクトは、 .resize()
介して0-dと多次元の間で遷移できます...
ndarray
がSequence
なることは決してないことを受け入れます。[ isSequenceType
ことは、少し気を散らすものです。 これは、抽象基本クラス(2.6で追加された)の存在よりも前の古い関数であり、シーケンスに必要な詳細なインターフェイスを特定しようとさえしません。タイプ(1)が__getitem__
定義していることを確認するだけです。 dict
はありません。 明らかに、これは多くの状況で間違った答えを与えるでしょう(例えば、口述のように振る舞うが、それではないものは何でも!)。 したがって、実際にシーケンスタイプが必要な場合は、 isinstance(obj, Sequence)
がより適切に機能し、2to3が適切に機能します。 しかし、それはnumpyに問題を引き起こします...]
たぶん、Pythonの人々を説得して、Sequenceの下にあり、 .index
または.count
保証せず、 .__len__
だけを保証する、 SequenceBase
ような新しいクラスを作成することは可能でしょう。 .__len__
と__getitem__
など? シーケンスにindex
ようなものがあるのは素晴らしいことですが、シーケンスのようなものをダックタイピングする方法にすることで、 numpy
ようなものに強制するのは少し奇妙に思えます。 Pythonの人々は、これがやや問題があることを知っていますか?
@sebergの提案が好きです。 Python開発者が同意しない場合は、@ njsmithの2番目の箇条書きを選択します。 欠落しているオプションは、ndarraysがSequenceインターフェースを満たさないと言うことです。 最適ではありませんが、箇条書き1および3のimhoよりも優れています。
[おっと、「欠落しているオプション」はオプション4としてありましたが、どういうわけか、マークダウンパーサーはそれを混乱させて読めない方法で前の箇条書きに折りたたむことにしました。 コメントを編集してフォーマットを修正しました。]
Sequence
に登録されているタイプの半分、つまりbuffer
とxrange
、これらのメソッドはありません。 collections.Sequence
を基本クラス/ミックスインとして使用している人にとって便利なメソッドであるほど、これらがインターフェイスの必須メソッドであることは私にはわかりません。
@rkern :良いキャッチ。 したがって、おそらく解決策は、どこかにSequence.register(np.ndarray)
への呼び出しを追加することです。 (これは、元のレポーターの回避策にもなります。)
おそらく、ある時点で__reversed__
実装する必要があります...
このバグはpython3の下にのみ存在するわけではないため、このバグのタイトルは少し誤解を招くと思います。 確かに、 random.sample(numpy_array)
はpython2で機能しますが、 isinstance(np.array([1]), collections.Sequence)
は任意のpython> = 2.6でTrue
を返すはずです。
autopep8モジュールを使用してPython2.7でこのバグに遭遇しました。 デフォルトでは、operator.isSequenceType()呼び出しの一部をisinstance(x、collections.Sequence)に変換しました。 numpy.ndarrayを渡すと、テストはFalseになります。 これは非常に卑劣なバグである可能性があります。
python-pillowモジュールを使用して、Python2.7でも発生しました。 Image.point(lut、mode)はisinstance(lut、collections.Sequence)を呼び出し、以前のバージョンではoperator.isSequenceType()を使用していました
numpyの数値スカラー型が登録されているので(#4547)、これを再検討する良い機会かもしれません。
したがって、おそらく解決策は、Sequence.register(np.ndarray)への呼び出しをどこかに追加することです。
うん、それは良い妥協だ。
はい、 Sequence.register(np.ndarray)
どこかに追加してください。
@mitar PRの提出に興味はありますか?
承知しました。 これはどこに行くべきですか? np.ndarray
が作成されたのと同じファイルに?
実際にこれが良い考えだと思っていることを確認するために、空の配列がFalse
(#9718)であるという非推奨を追加しています。つまり、シーケンスで機能するものの1つを削除しています) 。 コメントを読んでも、配列スカラーは機能しないという結論がすでに出ていると思うので、空の配列はその約束の破綻の一部である可能性があると思います...
将来の参考のために、これを行う適切な場所はおそらくnumpy.core.multiarray
です:
https://github.com/numpy/numpy/blob/4f1541e1cb68beb3049a21cbdec6e3d30c2afbbb/numpy/core/multiarray.py
OKこれが欲しいです。 どうやって? これは私がメソッドとしてそれらを実装する方法です:
def __reversed__(self):
return iter(self[::-1])
def index(self, value) -> int:
return np.in1d(self, value).nonzero()[0]
def count(self, value) -> int:
return (self == value).sum()
# Necessary due to lack of __subclasshook__
collections.abc.register(np.ndarray)
最新バージョンのTensorflow(2.0)では、 Sequence.register(np.ndarray)
があると、Tensorflowが誤動作することがわかりました。 値がシーケンスであるかどうかをどこかでチェックしているようで、それがndarrayである場合とは使用方法が異なります。
参照: https :
陽気な、こっけいな。 ほとんどの場合、特別に処理されるケースになるため、何かが配列であるかどうかをテストする方がよいと確信しています。
おそらく型チェックの順序が間違っています。最初にndarrayをチェックし、次にシーケンスをチェックする必要があります。 ただし、最初にシーケンスを確認すると、そのコードブロックが実行されます。
@mitar __contains__
/ operator.in
動作が異なるため(再帰的で、シーケンスではない)、APIコントラクトが破られるため、これを閉じることを検討しています。 これのユースケースはありますか?
ここで念頭に置いているAPI契約について詳しく教えてください。 正確にはわかりません。
ユースケースは、シーケンスを反復処理し、次元を次元に戻してから再帰できる場合など、物事を変換する方法を知っているジェネリックコードを作成することです。 次に、2d ndarrayと同じ方法でリストのリストを変換できますが、複数の次元などに一般化できます。 そして、それがシーケンスであることだけをチェックする必要はありません。
前述のように、配列をネストされたPythonシーケンスとして表示することにはいくつかの問題があります。 __contains__
が最も明白なものであり、もう1つは、0-D配列がネストされたシーケンスではないことです。 また、長さ0の次元などの微妙な点も存在し、 arr[0]
はそれ自体が任意の配列である可能性があるため、通常arr[0] = 0
はarr[0] == 0
意味しません(次のように綴る方がよいでしょう)。 arr[0, ...]
。個人的には、「ネストされたシーケンス」の解釈は良いと思いますが、私たちが考えるよりも有用ではありません(つまり、配列をfor col in array
として繰り返すことはめったになく、たとえそうしても、 for col in array.iter(axis=0)
書いてもかまいません
ですから、私は「配列はシーケンスである」を少し問題のあるアナロジーと見なす傾向があります(これは、それが役に立たないという意味ではありませ
ただし、ユースケースが何であれ、新しい「ElementwiseContainer」などの新しいABCを探索する方がよいのではないかと思います。 また、 +
や==
などが各要素で機能し、Pythonシーケンスとは異なり、 +
が連結されることを期待してはならないこともユーザーに通知します(はい+
はシーケンスABCの一部ではありませんが、Pythonでは自然に感じられます)。
通り過ぎるだけ-
Pythonのcollections.abc.Sequence
は__eq__
やその他の比較を実装していないことに気付いたので、先週Python-ideasに書き込みました-シーケンスをリストのように動作させるためにそれらを実装する他のすべてのメソッドがあり、タプル。 (そのメールスレッドは私をこの問題に導きます)。
そこに__eq__
追加することを提案していましたが、明らかにそれらのシーケンスがNumpy.arrayの動作とは異なるものになります。
Pythonで、「シーケンス」とは何かをさらに形式化してから、特殊なケースとして分岐するこれらのものを委任して、そこにcollections.abc.ComparableSequence
を追加するの+
が上で述べたので、「比較が単一のブール値になり、連結のスカラーとして動作し、スカラーで乗算するシーケンス」を意味する他の名前かもしれません-つまり-Pythonの動作リストとタプルの+
と*
)。 したがって、Sequenceの仕様は、少なくとも1Dnumpy配列が正確に一致するように形式化できます。
Pythonシーケンスとは何かに関するこの形式化は、上記のhttps://github.com/numpy/numpy/issues/2776#issuecomment-330865166で言及されているような他の相違にも役立つ可能性があります。
しかし、私はその道を一人で進むのに十分なモチベーションを感じていません-しかし、これが理にかなっているなら、私は喜んでPEPを書き、それを押し進めるのを手伝います。 (シーケンスが__eq__
作成しなかった理由を確認したかっただけで、これを取り上げたときにそのPRがあった可能性があります)
@jsbueno私の問題は、追加の内容が実際にはわからないこと、または定義の間にndarray
ユーザーにとって実際に役立つことです。 私が考えることができる最高のものは、 Collection
count()
とindex()
を持つcount()
ですが、それは便利ですか? それ以外のものは、Python自体がほとんどまたはまったく概念を持っていないもののABCになります。
SymPyは実際にそれをより正しくしたと思います。 行列のすべての要素を反復処理し、少なくともCollection
ます。
さて、それについて多くのことができるとは思えません。すべての要素のSymPy反復が非常に便利(かつ直感的)であるかどうかさえわかりませんが、少なくともすべての要素の反復は__contains__
と一致しています。 これは、 len(Matrix)
が要素の数であり、 Matrix.shape[0]
はないことも意味することに注意してください。
1次元配列を除いて、上から何度も繰り返すリスクがありますが、numpy配列とは何ですか?:
Container
:要素の:heavy_check_mark:Sized
+ Iterable
のサブアレイ(1-Dでない場合):質問:Reversible
:実装するだけで、心配はいりません。 :質問:count()
およびindex()
:要素に実装できます(:heavy_check_mark :)Sequence
:サブアレイの反復可能オブジェクトと要素コンテナの不一致:x:したがって、最も基本的なプロパティのいくつかでさえ衝突します。 NumPyはContainer
であり、 .index()
と.count()
実行方法を知っています。つまり、 Sequence
が、 Iterable
部分はありません。 独立してIterable
ですが、サブ配列です。
そして、それが紛らわしい混乱のように思えるなら、私は同意しますが、それは仕様によるものだと思います。 唯一の真の解決策は、SymPyパスを使用するか、最初からIterable
はないことです。 (SymPyパスに進むことはできません。また、 __iter__
を非推奨にするチャンスがあるとは思えません。)
個人的には、1次元配列は別として、配列のようなものはPythonコレクションとはまったく異なる獣であると私は期待しています。 反復動作を検討する場合、 __contains__
と__iter__
間の不一致を具体的に示すために、 MultidimensionalCollection
が必要になります(ただし、これは便利ですか?)。
Sequence
で現在定義されているものを超えて見ると、 ElementwiseCollection
(演算子はコンテナ演算子ではなく要素ごとの演算子です。たとえば+
)が最も多いと思います。 numpy配列および一般的なすべての配列のようなものの特性を定義します(配列プログラミングを参照)。 それはまた、Python自体とは完全に異質な概念であり、時にはそれと対立する概念でもあります。
唯一のことは、1次元配列をマークし、1次元配列のみをシーケンスとしてマークすることです。これは、サブ配列と要素の不一致がないためです。 その時点で、はい、もちろん__eq__
はそれらに対して定義されておらず、 __nonzero__
は通常のPythonシーケンスのように定義されていません。
ご回答ありがとうございます。ここで8年の長いワゴンに飛び乗ったことを改めてお詫び申し上げます。 あなたのコメント、最後の電子メール交換の数時間後、そして途中で別の友人とチャットしたことで、私はこれらのことのほとんどはそのままにしておく方が良いと同意します。 将来的には、Pythonは、「collections.abc.Sequenceが現在実装しているもの」よりも正式なSequenceの定義を選択できるようになります。
上記のコメントを読んだ後、「Pythonシーケンスを作成するもの」としてリストした特性には、ndarrayをリストやタプルなどのシーケンスに似せる最も重要な機能が欠けていると思います。連続したインデックスを持つ-すべての個々の要素に対応できるスペース。 しかし、そのためにabcを形式化することは、コーディングでも静的型のヒントでも、実用的な価値があるとは思いません。
@sebergそれは素晴らしいあらすじです。
この問題は、 Sequence
またはIterable
またはContainer
を期待するコンテキストでndarray
を使用することに関するもののようです。 簡単なアプローチは、適切なインターフェースを約束して提供し、 isinstance
チェックに応答する安価なビューを公開するndarray
メンバーを持つことです。 例えば:
class ndarray(Generic[T]):
def as_container(self) -> Container[T]:
if self.ndim == 0:
raise ValueError
return ContainerView(self) # correctly answers __len__, __iter__ etc.
def as_subarray_iterable(self) -> Iterable[np.ndarray[T]]:
if self.ndim <= 1:
raise ValueError
return SubarrayIterableView(self)
def as_scalar_sequence(self) -> Sequence[T]:
if self.ndim != 1:
raise ValueError
return ScalarView(self)
def as_subarray_sequence(self) -> Sequence[np.ndarray[T]]:
if self.ndim <= 1:
raise ValueError
return SubarraySequenceView(self) # this view has to reinterpret __contains__ to do the expected thing.
ndarray
がすべての人にすべてであることを約束する代わりに、ユーザーは必要なものを要求し、 ndarray
がそれを提供できる場合は、可能な限り安価な方法で提供します。 できない場合は、例外が発生します。 これにより、ユーザーが実行する必要のあるndim
チェック(特に型アノテーションを使用する場合)をndarray
移動することで、ユーザーコードが簡素化されます。
その最後の注釈はIterable
ではなくSequence
ありますか?
@ eric-wieserうん! ありがとう。 あなたの考えは何ですか?
ええと、 as_subarray_sequence
は実質的にlist(arr)
:)
@ eric-wieserええ、ビューを提供する方が安いと思いましたが、わかりません。
ええと、 list(arr)
はlen(arr)
ビューを生成するだけで、私が繰り返した場合、とにかく生成することになります。
何ができるのかということに焦点を合わせすぎており、現時点での問題点については十分ではないと思います。 特に、上記のすべてのメソッドは、ndarrayのようなものがあることがわかっている場合、非常に簡単に実装できます(0-D配列がコンテナーではないことに同意しません)。 したがって、標準化されたABCが存在する場合にのみ有用であり、その場合は、基本的なインデックス作成がnumpy互換であり、 .flat
プロパティが含まれていることを定義するだけでも十分です。
元の問題( random.sample
が機能しなくなった)は、時間が経過したため、かなり無関係のようです。 はい、少し面倒ですが、ユーザーはサブ配列または要素が選択されることを期待している可能性があるため、おそらくそれはさらに良いことです。
ダックタイピングコードを壊すと確信しています。 おそらくシリアル化でいくつかの問題が発生します(手元に例はありません)。 そして、そのようなコードの多くは、 ABC
isinstance
チェックを使用しても問題はありませんが、特にnp.ndarray
をチェックするのは嫌です。 ndarrayにメソッドを追加することがどのように役立つかわかりません。おそらく、 .ndim
プロパティを少し超えるだけで、ネストされたシーケンススタイルの反復を祀る新しいABC
が必要になります。
上記のような方法は、任意の配列のようなもので動作するコンシューマープロトコルとして合理的かもしれませんが、それは私たちが解決しようとしている問題です:)? それらは、典型的なPythonシーケンスが公開したいものとは異なるようです。
@ eric-wieser
もちろんあなたは正しいですが、シーケンス全体を繰り返すことはできません。 あなたはいくつかの要素だけを選ぶかもしれません。
@seberg
私たちはまだ何ができるかについて焦点を合わせすぎており、現時点での問題が何であるかについて十分ではないと思います
仰るとおりです。 どんな問題を想像していますか? numpy 1.10が型とともに出てくるとき、私は時々1次元のnumpy配列をシーケンスとして使いたいと思うでしょう。 私が現在それをしたいのなら、私はする必要があります:
cast
を呼び出して、mypyに実際にはシーケンスであることを伝えます。そのため、自動的にそれを行う方法を提供したいと思います。 私も大きなインターフェースが嫌いですが、型アノテーションが普及するにつれて、これらの種類のメソッドや裸の関数がますます普及するように思えます。 どう思いますか?
(0-D配列がコンテナーではないことに同意しません)。
よくわかりませんが、現在__len__
で調達しているので、コンテナのようには機能しないようです。 コンテナを受け入れる関数に0-D配列を渡すと、mypyがエラーを報告するのに役立つと思います。 0-D配列コンテナを作成した場合はキャッチされません。
新しいABCが必要になります。おそらく、.ndimプロパティだけで、ネストされたシーケンススタイルの反復を祀っています。
私はそれを私の提案に加えたくありませんでしたが、とにかくあなたが向かっているところだと思います。 私は素晴らしいデザインのJAXライブラリの熱心なユーザーです。 将来的には、 numpy.ndarray
とjax.numpy.ndarray
(サブクラスを持つ)の両方が、ある種の抽象的なNDArray
から継承されると思います。 ndim
よりもはるかに多く持つことができます。 理想的には、少なくともNDArray(Generic[T])
であり、イベントの形状や次元数もあるかもしれません。 __eq__
NDArray[np.bool_]
返す可能性があります。 あなたはおそらく私よりよく知っています:)
数年前、 numpy.array
がcollections.Sequence
から継承されるべきであることを示唆するためにこの問題を検索しましたが、今ではこのスレッドの引数(特にあなたの引数)は非常に説得力があります。 ゴツゴツした配列は実際にはシーケンスではなく、それらをシューホーニングすると、良いというよりも害が大きくなるようです。 なぜそれらを自分のものにし、ユーザーに必要なインターフェースを明示的に要求するように強制しないのですか?
そして、そのようなコードの多くは、ABCでisinstanceチェックを使用しても問題はありません。
あなたがそれを言ったので、多分私の提案された方法のすべては見解を返したはずです。 そうすれば、彼らはisinstanceチェックに正しく答えることができます。
上記のような方法は、任意の配列のようなもので動作するコンシューマープロトコルとして合理的かもしれませんが、それは私たちが解決しようとしている問題です:)? それらは、典型的なPythonシーケンスが公開したいものとは異なるようです。
これに対する答えは、私たちが解決しようとしている問題に依存することに私は間違いなく同意します。 タイプアノテーションのクールエイドを飲んだので、 # type: ignore
コードをポイ捨てせずにmypyを渡す簡潔なnumpyコードを書くことに興味があります。 どの問題を考えていますか?
さて、タイプのヒントと他の配列のようなオブジェクトとの相互運用は、おそらく良い動機です。 新しい号またはメーリングリストのスレッドを開くことをお勧めします。 今のところ、ここで何を考えればいいのかわかりません。タイピングが形成されているので、それでいくつかのことが明らかになるかもしれません。
最も参考になるコメント
はい、
Sequence.register(np.ndarray)
どこかに追加してください。