2016-11-18 182 views
2

python的新手和试图教自己的语言。我理解R和SAS的基础知识,但是我仍然在学习如何操作数组并学习基本的python。将x和y数组的所有组合加入到函数f(x,y)中

为了简单起见,我真的很喜欢你的帮助,把x和y都送入函数f(x,y)(例如sin(xy))。

通常在R中,我会创建一个数据框,通过扩展x和y的值来创建每个组合(每行唯一的x和y),然后通过我的函数运行我的这些行,并在我的数据框中附加一个新列,并使用绘制轮廓图晶格等

对于相同的函数f(X,Y)= Z = SIN(X,Y),在python我试图

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功能。在这里,他们通过仔细创建xs和ys来创建x和y的组合。 – Leo

+0

一种方法是创建一个'np。lnspace'长度为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

只用list()代替列表理解 – 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) 

如果您使用自己的函数需要的两个项目一个参数 - (X,Y)或[X,Y] ...:

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

拼接在X和Y的从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通过重组你的函数,在整个阵列,而不是片工作。

相关问题