2015-02-02 6 views
-1

Я пытаюсь создать массив 2D 5850x5850 из двух 1D-массивов, поместив их в это уравнение для 2D-gausian.2d массив для 2d функции из 2 1d массивов (Python)

psf = 1/(2*np.pi*sigma_x*sigma_y) * np.exp(-(x**2/(2*sigma_x**2) + y**2/(2*sigma_y**2))) 

Однако он возвращает 1D массив, waht я делаю неправильно?

+0

Не могли бы вы объяснить на словах, что должно делать это выражение, и, может быть, добавить пример? Потому что, пытаясь понять, чего вы хотите от выражения, не будет работать, поскольку выражение неверно (как вы говорите). –

+0

Являются ли 'x' и' y' ваши 1d массивы? Ваше уравнение просто делает элемент по элементу math на этих 2. Там нет ничего, что говорит «делать какие-то внешние или кросс-вычисления». – hpaulj

ответ

0

Он не понимает, что x и y означают, что для каждого x вы должны сделать это для каждого y. Если вы не можете найти библиотеку для создания 2d функции/guassians более удобно, попробуйте:

z = np.empty((len(x), len(y)) 

for idx, yval in enumerate(y): 
    z[:,idx] = f(x, yval) 

Где f(x, yval) если вы 2d функция, но где у вас есть y, используйте yval. Там должно быть больше поддержки для создания 2d-функции где-то, возможно, попробуйте scipy 2d гуассианские функции в поиске?

0

Правильное выражение, чтобы сделать 2d Gaussian бы

x = np.arange(0, size, 1, float) 
y = x[:,np.newaxis] 
x0 = y0 = 0 # your center 
np.exp(-4*np.log(2) * ((x-x0)**2 + (y-y0)**2)/radius**2) 
+0

Это приведет к созданию массива формы x по y? Если это так, это довольно приятно –

0

Если я правильно понимаю ваш вопрос: Все, что вам нужно сделать, это изменить форму ваших массивов. .

x.shape=(5850,1) # now it is column array 
y.shape=(1,5850) # now it is row array 

Затем вы можете действовать так же, как в своем исходном сообщении. Результатом будет массив 5850 на 5850. Каждая строка будет соответствовать разным x, и каждый столбец будет соответствовать разным y.

Однако я хотел бы изменить кое-что в вашем коде, чтобы заставить это выглядеть так:

psf = 1/(2*np.pi*sigma_x*sigma_y) * np.exp(-(x*x/(2*sigma_x*sigma_x) + y*y/(2*sigma_y*sigma_y))) 

ФОРМАТНО значение, как правило, неэффективно (если ваш компилятор не переводит его умножение, но в Python нет компилятора полагаться на). Квадрагирование намного медленнее, чем умножение. Когда вы берете на себя значение, ваш компьютер должен быть готов к тому, что он может быть отрицательным или что он не является целым числом. При умножении значений нет таких накладных расходов.

Try:

for i in xrange(0,1000000): 
    z=i**2 

for i in xrange(0,1000000): 
    z=i*i 

Formar побежал 0.975s на моей машине, а потом только 0.267s.

Смежные вопросы