将x和y数组的所有组合转换为函数f(x,y)

时间:2016-11-18 20:45:09

标签: python numpy spyder

python的新手,并尝试自学语言。我理解R和SAS的基础知识但是我仍在学习如何操作数组并学习spyder中的基本python。

我真的很乐意帮助你将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'])

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在这种情况下,您需要使用itertools.product。它可用于生成具有所有可能组合的列表。

例如,如果A = [1, 2]B = [3, 4]

itertools.product会返回一个可以存储在这样的数组中的iterable,

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

答案 1 :(得分: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]

从meshgrid

连接x和y
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来处理整个数组而不是切片。