2012-05-25 12 views
7

Chciałbym sprawdzić, czy dwa ndarrays nakładają się na widoki tego samego podstawowego ndarray.Jak sprawdzić, czy dwa plasterki numpy tablice są takie same (lub nakładających się)?

Aby sprawdzić, że dwa plastry są dokładnie takie same, mogę zrobić coś takiego:

a.base is b.base and a.shape == b.shape and a.data == b.data 

Porównanie buforów wydawało się do pracy w jednym prostym przypadku - może ktoś mi powiedzieć, czy to działa w ogóle?

Niestety, to przyzwyczajenie do nakładających się plasterków, a ja nie wymyśliłem, jak wyodrębnić z bufora dokładnie to, jakie jest jego przesunięcie w podstawowych danych - może ktoś może mi w tym pomóc?

Również powiedzieć a i b są plastry x i c jest kawałek b. Ponieważ dane wyjściowe są takie same, chciałbym również wykryć nakładanie się między c i a. Wydawałoby się, że powinienem móc uciec, porównując tylko bufor i kształt ... gdyby ktoś mógł mi dokładnie powiedzieć, byłbym wdzięczny.

Odpowiedz

9

numpy.may_share_memory() to najlepsza heurystyka, jaką mamy w tej chwili. Jest konserwatywnie heurystyczny; może dać ci fałszywe alarmy, ale nie da ci fałszywych negatywów. Myślę, że mogą istnieć sposoby poprawy heurystyki, aby być w 100% poprawne. Jeśli rozwiną się, zostaną złożone do tej funkcji, więc to najlepsza droga naprzód.

+0

Jakiego rodzaju spraw mogę się spodziewać? Jeśli po prostu przesuwające się fragmenty z krokiem niejednoczesności, który generuje fałszywy pozytyw, mogę z tym żyć ... – shaunc

+2

'x [0 :: 2]'/'x [1 :: 2]'. 'x [:, 0: 5]', 'x [:, 5:10]'. 'x = np.dstack (* args); np.may_share_memory (x [0], x [1]) ". –

1

Możliwe jest porównanie położenia indeksów w pamięci przy użyciu właściwości tablic z zakresu ctypes. Może to zająć trochę pracy, więc możesz cofnąć się i sprawdzić, czy istnieje inny sposób rozwiązania problemu.

Powiązane problemy