Заполнить массив 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]
Мой 1D массив, конечно, не так прост. Может кто-нибудь придумать способ избавиться от цикла for?
Обновление: я хочу сделать круговой фильтр для сверточного размытия. До того как я использовал np.outer(values,values)
который дал мне прямоугольный фильтр. Намек Дэвида позволяет мне очень быстро создать круговой фильтр. Увидеть ниже:
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
,
Вы можете сделать что-то подобное:
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)