Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数,该函数接受值的网格_Python_Numpy - Fatal编程技术网

Python 函数,该函数接受值的网格

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

我想要一个函数,它接受2个数字和一个矩阵,并使用它们进行乘法运算,然后在乘法后对矩阵的每个元素求和(参见下面的代码)

我正在尝试对x和y的所有可能组合执行此操作。不使用循环的最好方法是什么,因为我知道我可以使用不同的x和y值在函数上循环,但这似乎不是一种有效的方法

我尝试使用网格网格作为输入,但由于输入的广播方式,这不起作用

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
的每个值生成此结果,则需要shape
x.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。我添加了一个接受网格网格的版本。