2016-09-27 2 views
3

Я хотел бы спросить, как сгенерировать соответствующие значения из meshgrid. У меня есть функция foo, которая принимает один массив 1D с длиной 2 и возвращает некоторое действительное число.Создание данных из данных meshgrid (Numpy)

import numpy as np 

def foo(X): 
    #this function takes a vector, e.g., np.array([2,3]), and returns a real number. 
    return sum(X)**np.sin(sum(X)); 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 

Я генерирую решетки X и Y, используя meshgrid.

Затем, как я могу сгенерировать соответствующие значения Z, используя функцию «foo», чтобы построить их в 3D, например, с использованием функции plot_surface с значениями X, Y, Z?

Здесь возникает вопрос, как сгенерировать значения Z, которые имеют одинаковую форму с X и Y, используя функцию «foo». Поскольку моя функция «foo» принимает только 1D-массив, я не знаю, как я могу использовать эту функцию с X и Y для генерации соответствующих значений Z.

+0

Вы хотите 'z = foo ([x, y])' для каждой точки '(x, y)' в meshgrid? – Praveen

ответ

2

Сложите два массива numpy в «глубину» с помощью np.dstack, а затем измените функцию foo, чтобы она работала только по последней оси вашего массива. Это легко сделать с помощью np.sum с параметром axis=-1, вместо того, чтобы с помощью встроенного sum:

import numpy as np 

def foo(xy): 
    return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1)) 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 
XY = np.dstack((X, Y)) 

И теперь, вы должны получить:

>>> XY.shape 
(5, 3, 2) 
>>> foo(XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 

Если вы хотите, чтобы достичь того же эффекта, но без изменение foo, то вы можете использовать np.apply_along_axis, что должно делать именно то, что вам нужно:

>>> np.apply_along_axis(foo, -1, XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 
+0

Спасибо за замечательное решение. Это именно то, что я хотел сделать. Тем не менее, у меня есть некоторые проблемы для применения этого подхода к моему коду bock. Я действительно опубликовал еще один вопрос по этому вопросу [link] (http://stackoverflow.com/questions/39715227/making-a-function-that-can-take-arguments-in-various-shapes). Моя фактическая функция foo на самом деле что-то вроде 'return X [0] + X [1];', поэтому она не может выполнять итеративную операцию на вложенном массиве и может принимать только форму (2). Таким образом, если я поместил XY в свою фактическую функцию foo, она плюет на нашу ошибку. В этом случае, как можно генерировать Z, как вы это делали? –

+0

К сожалению, я забыл об этом! –

+0

Кстати, можете ли вы сообщить мне, как я должен изменить вашу оду, если я просто хочу использовать свою текущую функцию foo, которая может принимать только форму (2,)? –

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