Mam tablicę takiego:Jak zastosować maskę w kształcie dysku do tablicy numpy?
>>> np.ones((8,8))
array([[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
tworzę płytę w kształcie maski o promieniu 3 tak:
y,x = np.ogrid[-3: 3+1, -3: 3+1]
mask = x**2+y**2 <= 3**2
Daje:
>> mask
array([[False, False, False, True, False, False, False],
[False, True, True, True, True, True, False],
[False, True, True, True, True, True, False],
[ True, True, True, True, True, True, True],
[False, True, True, True, True, True, False],
[False, True, True, True, True, True, False],
[False, False, False, True, False, False, False]], dtype=bool)
Teraz chcę aby móc zastosować tę maskę do mojej tablicy, używając dowolnego elementu jako punktu centralnego. Tak więc, na przykład, z punktem środkowym punkcie (1,1), chcę uzyskać tablicę jak:
>>> new_arr
array([[ True, True, True, True, 1., 1., 1., 1.],
[ True, True, True, True, True, 1., 1., 1.],
[ True, True, True, True, 1., 1., 1., 1.],
[ True, True, True, True, 1., 1., 1., 1.],
[ 1., True, 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
Czy istnieje prosty sposób zastosować tę maskę?
Edytuj: Nie powinienem mieszać booleans i floats - to było mylące.
>>> new_arr
array([[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 255., 255., 255., 255., 255., 1., 1., 1.],
[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 255., 255., 255., 255., 1., 1., 1., 1.],
[ 1., 255., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1., 1., 1., 1.]])
Jest to bardziej wynik, którego wymagam.
tablica [maska] = 255
maskuje tablicy za pomocą punktu środkowego (0 + promień 0 + promień).
Chciałbym jednak móc umieścić dowolną wielkość maski w dowolnym punkcie (y, x) i automatycznie dopasować ją do rozmiaru.
To działa ... ale to dość hack, z duplikacją macierzy i zmianą typu dtype ... Mnożenie przez 0/1 jest kanonicznym sposobem sugerowanym przez @ 9000. – mac
@mac Tak, zgadzam się. Spodziewałem się uzyskać informacje zwrotne z PO, aby dowiedzieć się, czego tak naprawdę szuka. – jcollado
Przykro mi, że wprowadzam w błąd. Wyjaśniłem moje pytanie w moim poście. To, czego chcę, to sposób na uzyskanie elementów w oryginalnej macierzy, które są pokryte przez maskę, biorąc pod uwagę punkt środkowy (y, x) maski. Wtedy będę mógł nimi manipulować zgodnie z wymaganiami. – user816555