【问题标题】:Feeding all combinations of x and y array into function f(x,y)将 x 和 y 数组的所有组合输入函数 f(x,y)
【发布时间】:2017-04-02 19:27:49
【问题描述】:

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

我真的很想得到您的帮助,将 x 和 y 都输入到函数 f(x,y) 中(例如 sin(xy) 为简单起见)。

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

对于同一个函数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'])

感谢您的帮助!

【问题讨论】:

  • 你可以试试stackoverflow.com/questions/8722735/…。在这里,他们通过仔细创建 xs 和 ys 来创建 x 和 y 的组合。
  • 一种方法是创建一个长度为len(x)*len(y)np.linspace,然后通过获取该数组的%(模数)和/(除法)将两个列向量堆叠成一个矩阵长度
  • 一种方法是在两个索引列表上使用 itertools.combinations。然后使用索引从您的数组中获取项目并将它们传递给您的函数
  • 感谢您的所有回复。我会试试这些,看看我想出了什么!

标签: python numpy spyder


【解决方案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)]

【讨论】:

  • 谢谢!我会玩这个。我真的很感激。
  • 只需使用 list() 而不是列表推导
  • 已编辑,再次查看@user62622
【解决方案2】:

如果您使用带有两个参数的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

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,方法是重组您的函数以处理整个数组而不是切片。

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2012-09-04
    相关资源
    最近更新 更多