Python Numpy:计算不定变量函数输出矩阵的优雅解决方案
我整个周末都在寻找以下问题的更优雅(阅读:无循环编程手册)解决方案: 假设我们有一个自定义函数f(),其输入数量不定。为了简单起见,让我们从两个方面开始: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
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
对其进行转置。