заполнить массив Numpy осесимметричными значениями

Я пытаюсь найти быстрый способ заполнить массив Numpy симметричными значениями вращения. Представьте массив нулей, содержащий область в форме конуса. У меня есть одномерный массив значений, и я хочу повернуть его на 360° вокруг центра массива. Нет 2D-функции, такой как z=f(x,y), поэтому я не могу явно вычислить 2D-значения. У меня есть кое-что, что работает, но цикл for слишком медленный для больших массивов. Это должно сделать круг:

values = np.ones(100)
x = np.arange(values.size)-values.size/2+0.5
y = values.size/2-0.5-np.arange(values.size)
x,y = np.meshgrid(x,y)
grid = np.rint(np.sqrt(x**2+y**2))
arr = np.zeros_like(grid)
for i in np.arange(values.size/2):
    arr[grid==i] = values[i+values.size/2]

Мой одномерный массив, конечно, не такой простой. Может ли кто-нибудь придумать способ избавиться от цикла for?

Обновление: я хочу сделать круговой фильтр для сверточного размытия. Раньше я использовал np.outer(values,values), который давал мне прямоугольный фильтр. Подсказка Дэвида позволяет мне очень быстро создать круговой фильтр. Смотри ниже:

квадратный фильтр с np.outer()

круговой фильтр с ответом Дэвида


person Zac Diggum    schedule 06.02.2016    source источник


Ответы (2)


Для этого вы можете использовать причудливую индексацию:

values = np.ones(100)
x = np.arange(values.size)-values.size/2+0.5
y = values.size/2-0.5-np.arange(values.size)
x,y = np.meshgrid(x,y)
grid = np.rint(np.sqrt(x**2+y**2)).astype(np.int)

arr = np.zeros_like(grid)
size_half = values.size // 2
inside = (grid < size_half)
arr[inside] = values[grid[inside] + size_half]

Здесь inside выберите индексы, лежащие внутри круга, так как только эти элементы могут быть получены из values.

person David Zwicker    schedule 06.02.2016
comment
Отлично работает, огромное спасибо! Для значений с плавающей запятой необходимо сделать arr типом с плавающей запятой. - person Zac Diggum; 06.02.2016

Вы можете сделать что-то вроде этого:

x=y=np.arange(-500,501)
r=np.random.randint(0,256,len(x)/np.sqrt(2)+1)
X,Y=np.meshgrid(x,y)
im=(X*X+Y*Y)**(1/2)
circles=r.take(np.int64(im))
plt.imshow(circles)

круги

person B. M.    schedule 06.02.2016
comment
Спасибо, но это решение не то, что мне нужно. Я объясню разницу в отдельном ответе. - person Zac Diggum; 07.02.2016