2016-11-18 4 views
2

Новое на python и пытается научить себя языку. Я понимаю основы R и SAS, однако я все еще участвую в том, как манипулировать массивами и изучать базовый питон в spyder.Подача всех комбинаций массива x и y в функцию f (x, y)

Мне очень понравилась бы ваша помощь с подачей как x, так и y в функцию f (x, y) (например, sin (xy) для простоты).

Как правило, в R я создавал бы фрейм данных, расширяя значения x и y, чтобы создавать каждую комбинацию (уникальные x и y для каждой строки), затем запускать мои строки с помощью моей функции и присоединять новый столбец в моем фреймворке данных, и участок контура участка с использованием решетки и т.д.

Для одной и той же функции Р (х, у) = г = sin (х, у), в питоне я попытался

x = np.linspace(0, 1, 100) 
y = np.linspace(-1, 11, 100) 
z= np.equ(x,y) 

, которые, очевидно, не работал бы, но Я не уверен, как это сделать.

Это был предпринят после того, как пытался манипулировать следующий код из: Matplotlib line plot of x values against y:

import numpy as np 
import matplotlib.pyplot as plt 

fig,ax = plt.subplots(1) 

# create some x data and some integers for the y axis 
x = np.array([3,5,2,4]) 
y = np.arange(4) 

# plot the data 
ax.plot(x,y) 

# tell matplotlib which yticks to plot 
ax.set_yticks([0,1,2,3]) 

# labelling the yticks according to your list 
ax.set_yticklabels(['A','B','C','D']) 

Спасибо за любую помощь!

+1

Вы можете попробовать что-то вроде http://stackoverflow.com/questions/8722735/i-want-to-use-matplotlib-to-make-a-3d-plot-given-a-z-function. Здесь они создают комбинации x и y путем тщательного создания xs и ys. – Leo

+0

Один из способов - создать «np.linspace' длины 'len (x) * len (y)', а затем складывать два вектора столбца в матрицу, принимая '%' (модуль) и '/' (деление) этого массива с длиной – martianwars

+0

. Один из способов чтобы использовать itertools.combinations по двум спискам индексов. Затем используйте индексы для извлечения элементов из своих массивов и передайте их вашей функции. – kezzos

ответ

1

В этом случае необходимо использовать itertools.product. Его можно использовать для создания списка со всеми возможными комбинациями.

Например, если A = [1, 2] и B = [3, 4]

itertools.product вернет итератор, который может храниться в массиве, как это,

C = list(itertools.product(A, B)) 
# C = [(1,3), (1,4), (2,3), (2,4)] 
+1

Спасибо! У меня будет игра с этим. Я очень ценю это. – user62622

+1

Просто используйте список() вместо понимания списка – kezzos

+0

Отредактировано, посмотрите еще раз @ user62622 – martianwars

1

Если вы используете ufunc, который принимает два аргумента, используйте numpy.meshgrid() например:

x, y = np.meshgrid(np.linspace(0, 1, 5), np.linspace(-1, 11, 5)) 
r = np.equal(x, y) 

Если вы используете свою собственную функцию, чтобы t AKES один аргумент из двух элементов - (х, у) или [х, у] ...:

def f(one_d_array): 
    return one_d_array[0] == one_d_array[1] 

сростить х годов и у от meshgrid

q = np.concatenate((x[...,None],y[...,None]), 2) 

Затем используйте numpy.apply_along_axis

np.apply_along_axis(f, 2, q) 

Если вы используете свою собственную функцию, которая принимает аргументы x и y, используйте массивы, полученные из meshgrid.

def f1(x, y): 
    '''Returns 4x^2 + 2y^2''' 
    return 4*np.square(x) + 2*np.square(y) 

f1(x, y) 

Если массивы велики, стараются избегать использования apply_along_axis путем реструктуризации вашей функции для работы на целых массивов вместо ломтиков.