Numpy: ndarrayはcollections.abc.Sequenceから派生する必要がありますか?

作成日 2012年12月01日  ·  49コメント  ·  ソース: numpy/numpy

@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

最も参考になるコメント

はい、 Sequence.register(np.ndarray)どこかに追加してください。

全てのコメント49件

Python 3.xは、Python 2.xよりもrandom.sampleでより厳密なチェックを実行するだけです。 2.xでは、numpyもSequenceサブクラスではありません(ndarrayにはindexcountまたは__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.sampleSequenceインスタンスを必要とする理由は実際にはないように

__setitem__は実装されていますが、 __delitem__ __setitem__は実装されていないので、おそらくSomewhatMutableSequence

インターフェイスを「シーケンスにはこれらすべてが含まれている必要がありますが、一部のシーケンスにはこれらが含まれている必要がある」と解釈するのは理にかなっています。
ひどいO() "を持っているので、いくつかのメソッドの素朴な実装を提供しています。
確かに、ndarrayのコンテキストで不明確なのは、 insertpopのセマンティクスではありません。
ただし、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満たすことができないことを考えると、どちらのオプションが最も悪いかはわかりません。互換性を損なうことなく

  • ndarrayサブクラスでの互換性のない使用法を非推奨にし、最終的にそれらを削除して、 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と多次元の間で遷移できます...

  • ndarraySequenceなることは決してないことを受け入れます。

[ 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に登録されているタイプの半分、つまりbufferxrange 、これらのメソッドはありません。 collections.Sequenceを基本クラス/ミックスインとして使用している人にとって便利なメソッドであるほど、これらがインターフェイスの必須メソッドであることは私にはわかりません。

@rkern :良いキャッチ。 したがって、おそらく解決策は、どこかにSequence.register(np.ndarray)への呼び出しを追加することです。 (これは、元のレポーターの回避策にもなります。)

おそらく、ある時点で__reversed__実装する必要があります...

@rkernそうです、これはPEPの未解決の問題として言及されています: http//www.python.org/dev/peps/pep-3119/#sequences ステータスがFinalのPEPでも、未解決の問題が発生する可能性があるのは奇妙なことです。

このバグは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] = 0arr[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.ndarrayjax.numpy.ndarray (サブクラスを持つ)の両方が、ある種の抽象的なNDArrayから継承されると思います。 ndimよりもはるかに多く持つことができます。 理想的には、少なくともNDArray(Generic[T])であり、イベントの形状や次元数もあるかもしれません。 __eq__ NDArray[np.bool_]返す可能性があります。 あなたはおそらく私よりよく知っています:)

数年前、 numpy.arraycollections.Sequenceから継承されるべきであることを示唆するためにこの問題を検索しましたが、今ではこのスレッドの引数(特にあなたの引数)は非常に説得力があります。 ゴツゴツした配列は実際にはシーケンスではなく、それらをシューホーニングすると、良いというよりも害が大きくなるようです。 なぜそれらを自分のものにし、ユーザーに必要なインターフェースを明示的に要求するように強制しないのですか?

そして、そのようなコードの多くは、ABCでisinstanceチェックを使用しても問題はありません。

あなたがそれを言ったので、多分私の提案された方法のすべては見解を返したはずです。 そうすれば、彼らはisinstanceチェックに正しく答えることができます。

上記のような方法は、任意の配列のようなもので動作するコンシューマープロトコルとして合理的かもしれませんが、それは私たちが解決しようとしている問題です:)? それらは、典型的なPythonシーケンスが公開したいものとは異なるようです。

これに対する答えは、私たちが解決しようとしている問題に依存することに私は間違いなく同意します。 タイプアノテーションのクールエイドを飲んだので、 # type: ignoreコードをポイ捨てせずにmypyを渡す簡潔なnumpyコードを書くことに興味があります。 どの問題を考えていますか?

さて、タイプのヒントと他の配列のようなオブジェクトとの相互運用は、おそらく良い動機です。 新しい号またはメーリングリストのスレッドを開くことをお勧めします。 今のところ、ここで何を考えればいいのかわかりません。タイピングが形成されているので、それでいくつかのことが明らかになるかもしれません。

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