Masalahnya terdiri dalam pemodelan propagasi sinyal (mis. Cahaya atau suara dll) melalui serangkaian hambatan, seperti pada gambar di bawah ini. Sinyal tidak dapat melewati permukaan bawah (medan), tetapi dapat melintasi rintangan. Saya ingin menghitung jumlah rintangan yang dilalui.
Medan dan hambatan ada dalam array numpy 2D (x, y, z). Inilah yang saya lakukan:
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
Hasilnya akan menjadi seperti [0, 0, 0, 1, 1, 1, 2, 3, 4, 4, 4 ...]
per baris.
Metode ini berfungsi dengan baik (asalkan lembah di terisi diisi dengan menggunakan numpy.maximum.accumulate
). Sekarang, apakah mungkin untuk mempercepatnya dengan menggunakan solusi vektor?
Jawaban:
Seperti komentar di atas, Anda mungkin bisa membuat vektor operasi untuk menghapus loop dan membuatnya lebih efisien.
Namun, jika Anda mempertimbangkan masalah dengan cara yang sedikit berbeda - yaitu dari thresholding - Anda dapat memanfaatkan alat dari ndimage yang cerdik untuk menghitung hambatan:
Pertama, ambangkan data terrain Anda dengan tinggi sinyal Anda untuk mendapatkan array boolean di mana sinyal bisa berada, terlepas dari asalnya.
Kemudian Anda dapat menggunakan
ndimage.label
metode ini untuk mengelompokkan wilayah diskrit:Setelah ini selesai, dapatkan ID wilayah yang cocok dengan sel asal sinyal Anda. Dalam kasus Anda itu akan menjadi kolom pertama.
Sekarang ambang muncul di mana sinyal mencegat rintangan terrain +, dan kali ini memfilter wilayah di luar atau area yang diminati menggunakan
numpy.isin
.Dan putaran terakhir
ndimage.label
memberi Anda hitungan hambatan yang dicegat, karena kami telah menyaring area yang terhalang oleh medan:Ada sedikit lebih banyak kode di sini, tetapi ada dua keuntungan besar:
sumber