2016-02-06 8 views
1

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

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, конечно, не так прост. Может ли кто-нибудь подумать о способе избавиться от цикла?

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

square filter with np.outer()

circular filter with David's answer

ответ

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.

+0

Работает отлично, спасибо кучу! Для значений float нужно сделать arr float dtype. –

1

IIUC, вы можете сделать что-то подобное:

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) 

circles

+0

Спасибо, но это решение не то, что мне нужно. Я объясню разницу в отдельном ответе. –