2016-01-02 3 views
0

Скажем, у меня есть две матрицы:NumPy итерация в течение двух 2d массивов

X, Y = np.meshgrid(np.arange(0, 2, 0.1), np.arange(3, 5, 0.1)) 

и функцию, что-то вроде:

def func(x) : 
    return x[0]**2 + x[1]**2 

Как я могу заполнить матрицу Z (от размера np.shape (Х)), где каждый элемент формируется путем вызова func на двух соответствующих значений X и Y, то есть:

Z[i, j] = func([X[i, j], Y[i, j]]) 

Есть ли способ без использования двойного вложенного цикла?

+4

В коде есть опечатка 'x ** [1]'. – NKN

+1

Разве это не просто 'Z = func ([X, Y])'? –

+2

Лучше всего избегать дробных диапазонов (например, 'np.arange (0, 2, 0.1)'), поскольку неточности с плавающей запятой могут вызвать непредсказуемые конечные точки. Вместо этого используйте 'linspace'. –

ответ

3

Это также работает в векторной форме оценки функции:

import numpy as np 
X, Y = np.meshgrid(np.arange(0, 2, 0.1), np.arange(3, 5, 0.1)) 
def func(x) : 
    return x[0]**2 + x[1]**2 

Z = func([X,Y]) 
3

Для заданных Numpy массивов X и Y, вы можете просто сделать -

Zout = X**2 + Y**2 

Если вы на самом деле построения X и Y подобное, есть прямой путь, чтобы получить Z с broadcasting и таким образом избежать np.meshgrid, подобный так -

Zout = np.arange(0, 2, 0.1)**2 + np.arange(3, 5, 0.1)[:,None]**2 
+0

Я имел в виду произвольную функцию, но ваш ответ по-прежнему очень информативен. Не могли бы вы объяснить, что нравится [:, None]? – Tom

+1

@Tom. Чтобы расширить размер, введя новую ось с None. Итак, в этом случае мы преобразуем 1D в 2D с ним. И идея с расширенными измерениями здесь заключается в том, чтобы ввести ['broadcasting'] (http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html). – Divakar

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