NumPyは、配列を作成するときに本当に役に立ちます。 numpy.array
の最初の引数に__getitem__
と__len__
メソッドがある場合、これらは有効なシーケンスである可能性があるという基準で使用されます。numpyが多次元配列を作成しないようにする
残念ながら、NumPyが「役に立つ」ことなくdtype=object
を含む配列を作成したいと思います。
import numpy as np
class Test(object):
def __init__(self, iterable):
self.data = iterable
def __getitem__(self, idx):
return self.data[idx]
def __len__(self):
return len(self.data)
def __repr__(self):
return '{}({})'.format(self.__class__.__name__, self.data)
をし、「反復可能オブジェクトが」持っている場合は、異なる長さのすべてが正常であると私は私がしたい正確な結果を得る:最小限の例に分解
クラスには、このことを希望
>>> np.array([Test([1,2,3]), Test([3,2])], dtype=object)
array([Test([1, 2, 3]), Test([3, 2])], dtype=object)
が、これらは同じ長さを持って起こる場合numpyのは、多次元配列を作成します。
>>> np.array([Test([1,2,3]), Test([3,2,1])], dtype=object)
array([[1, 2, 3],
[3, 2, 1]], dtype=object)
不幸にもndmin
という引数しかないので、ndmax
を適用する方法があるのか、NumPyがカスタムクラスを別の次元として解釈するのを防ぐために(__len__
または__getitem__
を削除せずに)疑問に思っていましたか?
私は同様の質問を探してみましたが、私はいずれかを発見していません。たぶん私は間違ったフレーズを探しただけかもしれません。以前の質問への参照があればそれは素晴らしいでしょう。答えをありがとうが、私は実際に回避策を探していません。私はもっと正確な長さを事前に知らなくても配列の最大深度(ディメンション)を定義する方法や、numpyを無効にしてカスタムクラスインスタンスをシーケンスとして解釈する、より一般的なアプローチにもっと興味を持っています。 – MSeifert
クラスをサブクラス 'dict'に変更することで、インスタンスを反復することを止めることができます。これは、 'np.array'が' __getitem__'以上のテストを行っていることを示しています。しかし、私はその種のチェックを行うコードを見つけることができませんでした。 – hpaulj
http://stackoverflow.com/questions/36663919/override-a-dict-with-numpy-support - 同じ問題を抱えて苦労しています。 'np.array'があなたのカスタムクラスを反復するかどうかを制御します。同じ種類の回避策。 – hpaulj