一、遇到问题

发现分段函数的线画歪了:

经过分析,发现是这个函数的问题:当R<=0时,总是返回(array(0),array(0))

![]()

很气,不知道为啥

单独拿出来测试也是一样的效果:

二、解决问题

一开始猜是scalar自动转为np.array时有问题,然而,人家官方API说可以用scalar
后来怀疑是lambda表达式的问题,结果去掉后还是有问题
再后来尝试整数和小数,才发现,是输入为 整数/小数 的问题!

1、关于值域和定义域的坑

【坑了我一下午,怎么都不对,直到和朋友探讨,才一点点排除问题,真挺坑的。
实际上还是自己对于函数的 值域 定义域的注意不够。】

(1)定义域是int时,值域是int,输出中带的小数会被舍弃(不是四舍五入、而是直接抹掉)

错误使用:

# 注意!piecewise的输出(值域)类型按照定义域R的类型,如果R的类型是int,那么,即使输出是【[0.28, lambda R: R + 0.03]】,也会舍弃小数,输出int类型!
import numpy as np  
x = 3
Y1 = np.piecewise(x, [x < 3.01, x >= 3.01], [2.7, lambda x:x+3.78])  
print(Y1)
# 结果:2

正确使用:

import numpy as np  
x = 3.0
Y1 = np.piecewise(x, [x < 3.01, x >= 3.01], [2.7, lambda x:x+3.78])  
print(Y1)

# 结果:2.7

(2)延伸:当定义域是int时,条件可以是float、不会强转为int再判断,结果不会受影响

如果受影响,结果应为6,此处为2,故没问题。

2、向量vs标量

scalar value 标量,也就是单个数值

取向量时,只要有一个输入是float,即使其他变量是int,也不会出问题:

如果向量全是int,也会有问题:

官方API中有写,可以取scalar value:
https://numpy.org/doc/stable/reference/generated/numpy.piecewise.html

三、我的优化

直到piecewise的值域问题后,
单独用时可能还会注意到,但是,
当在函数中,一整个数组作为参数传入时,很可能会忽略掉!

于是,在piecewise前,先把自变量+0.00变成float再说:

图正了,完美:

四、教训

1、早点暴露问题,求助朋友
我自己搞了3个小时都不行、到处查、问GPT也没用答案,
把问题发给朋友后,两人同时思考,经过一个一个排除,半小时发现问题所在

一个人很难一步步排除所有可能性,但是,和人交流的时候,就会头脑更加清醒,因为你得说明白其中的逻辑。
所以,早点暴露问题是关键!

2、学会看官方文档、积累必要的英文词汇
我一开始怀疑是一个数有问题,数组就没问题,
就是因为不知道一个数的英文是scalar value
看英文官方文档头大、根本不知道看哪里

这也是从朋友那里获得的信息,她看英文官方文档比我擅长太多了

posted on 2023-09-26 21:33  西伯尔  阅读(88)  评论(0编辑  收藏  举报