Tôi có một mảng như thế này:Làm cách nào để áp dụng mặt nạ có hình dạng đĩa vào một mảng có nhiều mảng?
>>> 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.]])
tôi là tạo ra một mặt nạ đĩa hình với bán kính 3 như sau:
y,x = np.ogrid[-3: 3+1, -3: 3+1]
mask = x**2+y**2 <= 3**2
Điều này cho phép:
>> 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)
Bây giờ, tôi muốn để có thể áp dụng mặt nạ này cho mảng của tôi, sử dụng bất kỳ phần tử nào làm điểm trung tâm. Vì vậy, ví dụ, với điểm trung tâm tại (1,1), tôi muốn để có được một mảng như:
>>> 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.]])
Có một cách dễ dàng để áp dụng mặt nạ này?
Chỉnh sửa: Tôi không nên có booleans hỗn hợp và phao nổi - đó là gây hiểu lầm.
>>> 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.]])
Đây là kết quả tôi cần.
mảng [mặt nạ] = 255
sẽ che mảng bằng cách sử dụng điểm giữa (0 + bán kính, 0 + bán kính).
Tuy nhiên, tôi muốn có thể đặt bất kỳ mặt nạ có kích thước nào tại bất kỳ điểm nào (y, x) và tự động cắt nó để vừa.
Nó hoạt động ... nhưng đó là một hack, với sao chép mảng và thay đổi dtype của nó ... Nhân bằng 0/1 là cách kinh điển như đề xuất bởi @ 9000. – mac
@mac Vâng, tôi đồng ý. Tôi dự kiến sẽ nhận được một số phản hồi từ OP để tìm ra những gì anh ấy thực sự đang tìm kiếm. – jcollado
Tôi xin lỗi vì đã gây hiểu lầm. Tôi đã làm rõ câu hỏi của mình trong bài đăng của mình. Những gì tôi muốn là một cách để có được các yếu tố trong mảng ban đầu được bao phủ bởi mặt nạ, được đưa ra một điểm trung tâm (y, x) cho mặt nạ. Sau đó, tôi có thể thao tác chúng theo yêu cầu. – user816555