Python 函数,该函数接受值的网格
我想要一个函数,它接受2个数字和一个矩阵,并使用它们进行乘法运算,然后在乘法后对矩阵的每个元素求和(参见下面的代码) 我正在尝试对x和y的所有可能组合执行此操作。不使用循环的最好方法是什么,因为我知道我可以使用不同的x和y值在函数上循环,但这似乎不是一种有效的方法 我尝试使用网格网格作为输入,但由于输入的广播方式,这不起作用Python 函数,该函数接受值的网格,python,numpy,Python,Numpy,我想要一个函数,它接受2个数字和一个矩阵,并使用它们进行乘法运算,然后在乘法后对矩阵的每个元素求和(参见下面的代码) 我正在尝试对x和y的所有可能组合执行此操作。不使用循环的最好方法是什么,因为我知道我可以使用不同的x和y值在函数上循环,但这似乎不是一种有效的方法 我尝试使用网格网格作为输入,但由于输入的广播方式,这不起作用 import numpy as np def my_func(num1, num2, matrix2): return np.sum(matrix*num1*nu
import numpy as np
def my_func(num1, num2, matrix2):
return np.sum(matrix*num1*num2)
x = np.linspace(0,5)
y = np.linspace(0,1)
X, Y = np.meshgrid(x, y)
matrix = np.array([[1],[2],[3]])
a = my_func(X,Y,matrix)
我得到以下错误:
ValueError: operands could not be broadcast together with shapes (50,50) (3,1)
我希望
a
等于一个值网格,其中数组中的每个值对应于my_func
的输出,对于x
和y
的每个可能组合,看起来您必须调整x
和y
数组的尺寸:
import numpy as np
def my_func(num1, num2, matrix2):
return matrix*num1*num2
x = np.linspace(0,5, num=3)
y = np.linspace(0,1, num=3)
X, Y = np.meshgrid(x, y)
matrix = np.array([[1],[2],[3]])
a = my_func(X,Y,matrix)
print(a)
# [[ 0. 0. 0. ]
# [ 0. 2.5 5. ]
# [ 0. 7.5 15. ]]
当
x
和y
是标量时,x*y*M
的结果就是M.shape
。如果要为x
和y
的每个值生成此结果,则需要shapex.shape+y.shape+M.shape
的结果。你可以通过广播来实现这一点。其思想是,您需要重塑x
以使后续维度也填充y.ndim+M.ndim
维度和y
以具有M.ndim
后续维度
为了求和,实际上更容易解开M
,即使从1.7.0版开始允许多个轴
def my_func(x, y, matrix):
x = np.reshape(x, x.shape + (1,) * (y.ndim + 1))
y = np.reshape(y, y.shape + (1,))
return (x * y * matrix.ravel()).sum(axis=-1)
如果要输入已一起广播的x
和y
,可以稍微调整计算:
def my_func(x, y, matrix):
return ((x * y)[:, None] * matrix.ravel()).sum(-1)
概念上的区别在于,第一个版本接受您直接创建的
linspace
s,而第二个版本要求您构建meshgrid
,或者至少转置一个数组。请提供一些示例输入和一些示例输出。@Kraigolas我添加了运行代码后得到的输出,如果这是您的意思。我的意思是,提供一些示例,说明您试图获得的a
。你想要达到的目标有点不清楚。@Kraigolas我编辑了我的等式,这样我的目标就更容易理解了。由于我的问题不够清楚,我稍微改变了我的问题。我编辑了我的问题,这样我就更清楚我在寻找什么样的输出。@NahPlsMan。酷。我更新了总数。试着运行我发布的内容,让我知道它是否有效。我运行了代码,效果很好,谢谢。但是,可以通过某种方式将网格X和Y作为函数的输入,并让函数生成一个值网格。我在想一件类似于np.vectorize的事情,函数从输入数组中获取每个参数,并使用它计算返回值。@NahPlsMan。我添加了一个接受网格网格的版本。