问题描述
我正在尝试创建一个称为函数2的函数,该函数可以对函数进行向量化,当我仅创建一个函数时,该函数就可以工作,但是如果尝试将其包装在另一个函数中,则无法获得所需的结果
此代码有效
A= np.array([1])
B= np.array([2])
def function1(a,b):
if a > b:
return a - b
else:
return a + b
function1 = np.vectorize(function1)
function1(A,B)
out array([3])
但是这不是,我也不知道为什么,我期望得到与array([3])上面的代码相同的结果
def function1(a,b):
if a > b:
return a - b
else:
return a + b
def function2(a,b):
function2 = np.vectorize(function1)
return function2
function2(A,B)
out <numpy.vectorize at 0x24f0a22eba8>
感谢您的提前帮助
解决方法
这是因为在第二种情况下,您没有调用函数,而只是返回了函数对象。 -bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# COPY procedurehistory FROM '/tmp/foo.csv' DELIMITER ',' CSV HEADER;
ERROR: unquoted newline found in data
HINT: Use quoted CSV field to represent newline.
CONTEXT: COPY procedurehistory,line 103: ""
postgres=# \q
-bash-4.2$ sed -i "s/^M//g" /tmp/P9-ProceduresHistory.csv > /tmp/foo.csv
-bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# COPY procedurehistory FROM '/tmp/foo.csv' DELIMITER ',' CSV HEADER;
COPY 2284
返回函数对象,但不调用它。
将代码更改为-
np.vectorise
现在应该工作。
-
在第一种情况下,function2是向量化的函数对象本身,将(A,B)参数传递给它将对其进行调用。
-
在第二种情况下,function2是一个参数函数,但它不使用参数a,b而是返回一个函数对象。因此,当您使用参数调用它时,它会覆盖function2并每次都返回一个矢量化的函数对象,从而完全忽略所有参数。
-
在第三种情况下(我的解决方案),您正在调用function3,该函数接受A,B参数并首先对function1进行向量化。接下来,它将使用传递的参数调用此向量化函数,并返回输出。
按照函数调用和函数中的代码顺序行进行操作,这样就会非常清楚为什么会发生这种情况。