Tín hiệu thâm nhập trong numpy


8

Vấn đề bao gồm mô hình lan truyền tín hiệu (ví dụ: ánh sáng hoặc âm thanh, v.v.) thông qua một loạt các chướng ngại vật, như trên hình dưới đây. Tín hiệu không thể đi qua bề mặt đáy (địa hình), nhưng nó có thể vượt qua chướng ngại vật. Tôi muốn đếm số lượng chướng ngại vật đi qua.

nhập mô tả hình ảnh ở đây

Địa hình và chướng ngại vật nằm trong mảng numpy 2D (x, y, z). Đây là những gì tôi làm:

output = numpy.zeros(terrain.shape)

obstacles = terrain + obstacle_heights


for i in xrange (obstacles.shape[0]):
    for j in xrange (obstacles.shape[1]):

        mask = obstacles[i,j] > terrain[i,j:]
        output[i,j:][mask] +=1

Kết quả sẽ giống như [0, 0, 0, 1, 1, 1, 2, 3, 4, 4, 4 ...]mỗi hàng.

Phương pháp này hoạt động tốt (cung cấp các thung lũng trên địa hình được lấp đầy bằng cách sử dụng numpy.maximum.accumulate). Bây giờ, liệu có thể tăng tốc độ bằng cách sử dụng một giải pháp véc tơ?


1
Câu hỏi thú vị. Bạn có thể giải thích chi tiết hơn về giải pháp nào bạn đang tìm kiếm và đâu là dữ liệu đầu vào? Tôi nghĩ rằng bạn đang tìm kiếm việc tạo ra các dòng (như các lớp linestring) đại diện cho tín hiệu, nhưng trong trường hợp này, cần phải chỉ định một hướng ngoài định dạng nguồn.
mgri

Tôi quan tâm đến cả hai, âm học và suy giảm ánh sáng (ví dụ: khói mù, khói). Để đơn giản, tín hiệu truyền song song với địa hình (theo chiều dọc) và song song với lưới địa hình (theo chiều ngang). "Tín hiệu" Tôi chỉ có nghĩa là một trình vòng lặp đơn giản trên ma trận numpy.
Zoran

1
Và những gì về chiều cao tín hiệu?
dmh126

Chiều cao tín hiệu là tùy ý: giả sử 1,7 mét cho chiều cao của con người ... Sau đó, bạn có thể nâng (tạm thời) địa hình cho giá trị đó `mask = chướng ngại vật [i, j]> địa hình [i, j:] + 1.7` <in Mã của tôi đang sử dụng kích thước góc có được bằng cách chia độ cao với khoảng cách từ nguồn - nhưng điều đó không liên quan ở đây, dường như đối với tôi (?)>
Zoran

Chắc chắn sẽ có thể vector hóa nó, FFT có thể được vector hóa ( jakevdp.github.io/blog/2013/08/28/under Hiểu-the-ffft ). Tôi đang đấu tranh để hiểu những gì trở ngại.shape [0] và trở ngại.shape [1] đại diện mặc dù.
John Powell

Câu trả lời:


1

Như các ý kiến ​​đã nói ở trên, có lẽ bạn có thể vector hóa hoạt động để loại bỏ các vòng lặp và làm cho nó hiệu quả hơn.

Tuy nhiên, nếu bạn xem xét vấn đề theo một cách hơi khác - đó là ngưỡng - bạn có thể tận dụng các công cụ từ scimy ndimage để đếm các chướng ngại vật:

Đầu tiên, ngưỡng dữ liệu địa hình của bạn theo chiều cao tín hiệu của bạn để có được một mảng boolean nơi tín hiệu có thể, bất kể nguồn gốc.

signal_reach = terrain < signal_height

Sau đó, bạn có thể sử dụng ndimage.labelphương pháp để nhóm các vùng riêng biệt:

from scipy import ndimage
signal_regions, region_count = ndimage.label(signal_reach)

Khi điều này được thực hiện, hãy lấy (các) ID khu vực khớp với (các) ô gốc của tín hiệu của bạn. Trong trường hợp của bạn, nó sẽ là cột đầu tiên.

import numpy as np
origin_labels = np.unique(signal_regions[:, 0]) # or whatever indexes meet the start of the signal
# ndimage lables are greater than 1, 0 is an unlabeled region
origin_labels = origin_lables[origin_lables > 0]

Bây giờ ngưỡng phát sinh nơi tín hiệu chặn địa hình + chướng ngại vật và lần này lọc ra các khu vực bên ngoài hoặc khu vực quan tâm sử dụng numpy.isin.

area_of_interest = np.isin(signal_regions, origin_labels)
signal_intercepted = (obstacles >= signal_height) & area_of_interest

Và vòng cuối cùng ndimage.labelcung cấp cho bạn vô số chướng ngại vật bị chặn, bởi vì chúng tôi đã lọc ra các khu vực bị chặn bởi địa hình:

obstacles_hit, obstacle_count = ndimage.label(signal_intercepted)

Có thêm một chút mã ở đây, nhưng có hai lợi thế lớn:

  • Không có vòng lặp có nghĩa là mã phải nhanh chóng hợp lý,
  • Và với mục đích tính toán, nguồn gốc tín hiệu có thể ở trên hoặc nhiều ô, bất cứ nơi nào trên raster địa hình.

1
Đây có vẻ là một cách tiếp cận đầy hứa hẹn! Tôi sẽ kiểm tra nó vào tháng 1 và đánh dấu nó là độ dốc nếu nó hoạt động.
Zoran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.