NumPy jest bardzo pomocny przy tworzeniu tablic. Jeśli pierwszy argument dla numpy.array
ma metodę __getitem__
i __len__
, są one używane na tej podstawie, że może to być poprawna sekwencja.Zapobieganie tworzeniu się wielowymiarowej tablicy numpy
Niestety, chcę utworzyć tablicę zawierającą dtype=object
, a NumPy nie będzie "pomocna".
podziale na minimalnym przykład klasa chciałby to:
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)
i jeśli „iterables” mają różne długości wszystko jest w porządku i mam dokładnie taki wynik chcę mieć:
>>> np.array([Test([1,2,3]), Test([3,2])], dtype=object)
array([Test([1, 2, 3]), Test([3, 2])], dtype=object)
ale NumPy tworzy wielowymiarową tablicę jeśli zdarzy się one mają taką samą długość:
>>> np.array([Test([1,2,3]), Test([3,2,1])], dtype=object)
array([[1, 2, 3],
[3, 2, 1]], dtype=object)
Niestety istnieje tylko argument ndmin
, więc zastanawiałem się, czy istnieje sposób na wymuszenie ndmax
lub w jakiś sposób uniemożliwić NumPy interpretowanie niestandardowych klas jako innego wymiaru (bez usuwania __len__
lub __getitem__
)?
Próbowałem szuka podobnych pytań, ale nie znalazłem żadnego. Może po prostu szukałem niewłaściwych zdań. Jeśli masz jakieś odniesienia do wcześniejszych pytań, które byłyby świetne. Dziękuję za odpowiedź, ale w rzeczywistości nie szukam obejścia. Bardziej interesuje mnie bardziej ogólne podejście do definiowania maksymalnej głębokości (wymiarów) tablicy bez znajomości dokładnej długości wcześniej lub wyłączenia tego numpy interpretującego instancję klasy niestandardowej jako sekwencję. – MSeifert
Zmieniając klasę na podklasę 'dict', mogę zatrzymać ją od iterowania instancji. Oznacza to, że 'np.array' testuje więcej niż' __getitem__'. Ale nie udało mi się znaleźć kodu, który przeprowadza takie sprawdzanie. – hpaulj
http://stackoverflow.com/questions/36663919/override-a-dict-with-numpy-support - zmaga się z tym samym problemem; kontrolowanie, czy 'np.array' iteruje na twojej klasie niestandardowej, czy nie. Taki sam rodzaj pracy wokół. – hpaulj