Python Numpy:计算不定变量函数输出矩阵的优雅解决方案

Python Numpy:计算不定变量函数输出矩阵的优雅解决方案,python,numpy,Python,Numpy,我整个周末都在寻找以下问题的更优雅(阅读:无循环编程手册)解决方案: 假设我们有一个自定义函数f(),其输入数量不定。为了简单起见,让我们从两个方面开始: def f(x,y): return x + y 现在,我将一个包含正确数量变量的数组传递给此函数: x = np.array([x0, x1, x2, ..., xn]) y = np.array([y0, y1, y2, ..., yn]) 我想要的答案是: z = np.array([[x0 + y0, x0 + y1, x

我整个周末都在寻找以下问题的更优雅(阅读:无循环编程手册)解决方案:

假设我们有一个自定义函数f(),其输入数量不定。为了简单起见,让我们从两个方面开始:

def f(x,y):
    return x + y
现在,我将一个包含正确数量变量的数组传递给此函数:

x = np.array([x0, x1, x2, ..., xn])
y = np.array([y0, y1, y2, ..., yn])
我想要的答案是:

z = np.array([[x0 + y0, x0 + y1, x0 + y2, ..., x0 + yn],
              [x1 + y0, x1 + y1, x1 + y2, ..., x1 + yn],
              [x2 + y0, x2 + y1, x2 + y2, ..., x2 + yn],
              ...])
总之,我在寻找一个函数,我可以将另一个自定义函数传递给它,然后它计算所有可能的组合,而不必编写大量的for循环

请帮帮我,蜂巢思维

编辑1:自定义函数可能具有任意复杂性。从我的现实问题来看,这是一个例子:

def f(x, y):
    return 1 - (x/2)**y*binom(y, y/2)
编辑2:接受的答案按预期工作。Dish H Goyani链接到的答案使用不同的路径产生相同的结果


谢谢大家!堆栈溢出规则

您似乎正在寻找dot产品的应用程序:

In [1]: a = np.array([1, 2, 3, 4, 5, 6, 7])
In [2]: b = np.array([1, 2, 3, 4, 5, 6, 7])
In [3]: np.dot(np.matrix(a).T, np.matrix(b))
Out[3]: 
 matrix([[ 1,  2,  3,  4,  5,  6,  7],
         [ 2,  4,  6,  8, 10, 12, 14],
         [ 3,  6,  9, 12, 15, 18, 21],
         [ 4,  8, 12, 16, 20, 24, 28],
         [ 5, 10, 15, 20, 25, 30, 35],
         [ 6, 12, 18, 24, 30, 36, 42],
         [ 7, 14, 21, 28, 35, 42, 49]])

这只适用于将数组转换为具有两个维度(如矩阵对象)的对象,其中一个维度是单一维度。然后转置其中一个,点积可以精确地提供您所需的信息。

网格网格可以帮助您创建所有对,而不仅仅是求和。作为奖励,它可以扩展到更多维度:

>>> y = np.arange(1,5)
>>> x = np.arange(6,10)
>>> x
array([6, 7, 8, 9])
>>> y
array([1, 2, 3, 4])
>>> sum(np.meshgrid(x,y))
array([[ 7,  8,  9, 10],
       [ 8,  9, 10, 11],
       [ 9, 10, 11, 12],
       [10, 11, 12, 13]])
要将其放入接受未知数量数组的函数中,请执行以下操作:

def meshSum(*arrays):
    return sum(np.meshgrid(*arrays))
另一个数组的示例:

>>> z = np.arange(11,15)
>>> def meshSum(*arrays):
...     return sum(np.meshgrid(*arrays))
...
>>> meshSum(x,y,z)
array([[[18, 19, 20, 21],
        [19, 20, 21, 22],
        [20, 21, 22, 23],
        [21, 22, 23, 24]],

       [[19, 20, 21, 22],
        [20, 21, 22, 23],
        [21, 22, 23, 24],
        [22, 23, 24, 25]],

       [[20, 21, 22, 23],
        [21, 22, 23, 24],
        [22, 23, 24, 25],
        [23, 24, 25, 26]],

       [[21, 22, 23, 24],
        [22, 23, 24, 25],
        [23, 24, 25, 26],
        [24, 25, 26, 27]]])
编辑后,用于网格上的任意操作

def meshOperation(f, *arrays):
    return f((*np.meshgrid(*arrays))
其中
f
必须采用
*args
参数或等于
len(数组)
的参数数,因此网格运算(f,x,y)在最后一个示例中有效。

例如:

import numpy as np

# initial arrays
x = np.arange(1, 15, 3)
y = np.arange(1, 6) + 100

# get them to 2d
x2 = np.atleast_2d(x)
y2 = np.atleast_2d(y).T  #y should be vertical

# simple stuff
print("sum:\n", x2 + y2)

# complicated stuff
print("complicated:\n", x2/(1+y2) + np.exp(-y2/(1+x2)))

在NumPy之外,你也许可以利用。检查这个-你可能想看看NumPy阵列广播-@dishinghoyani:这太棒了!就像一个二维问题的魅力!我不明白,对于复杂度更高的自定义函数,这将如何工作?请看我的编辑!即使是你的第一个细胞也是错误的,除非我误读了你打算如何把它弄平。根据OP,第一个元素不应该是1+1。编辑后:这绝对适用于二维问题,对于三维问题,我下一步将尝试。奇怪的是,它会切换输入顺序,因此您必须转置输出数组。@olivherbst怪异和期望值取决于您的品味和经验。在结果中使用
.T
对其进行转置。