Пожалуйста, сделайте , а не , используйте .vectorize(..)
, это неэффективно, поскольку все равно будет выполнять обработку на уровне Python..vectorize()
следует использовать только в качестве крайней меры, если, например, функция не может быть рассчитана «навалом», потому что ее «структура» слишком сложна.
Но вам не нужно использовать .vectorize
здесьВы можете реализовать свою функцию для работы с массивами с помощью:
r_xy = np.sqrt(xx ** 2 + yy ** 2)
density = (r_xy <= R0) & (-hz <= zz) & (zz <= hz)
или даже немного быстрее:
r_xy = xx * xx + yy * yy
density = (r_xy <= R0 * R0) & (-hz <= zz) & (zz <= hz)
Это создаст массив логических выражений 2000 × 2000 × 20.Мы можем использовать:
intdens = density.astype(int)
для создания массива int
s.
Печать массива здесь довольно сложна, но в общей сложности она содержит 2'356'047 единиц:
>>> density.astype(int).sum()
2356047
Тесты : если я запускаю это локально 10 раз, я получаю:
>>> timeit(f, number=10)
18.040479518999973
>>> timeit(f2, number=10) # f2 is the optimized variant
13.287886952000008
Итак, в среднем мы вычисляем эту матрицу (включая приведение ее кint
с) за 1,3-1,8 с.