一、遇到问题
发现分段函数的线画歪了:
经过分析,发现是这个函数的问题:当R<=0时,总是返回(array(0),array(0))
![](https://img2023.cnblogs.com/blog/968024/202309/968024-20230926222555499-321276526.png)
很气,不知道为啥
单独拿出来测试也是一样的效果:
二、解决问题
一开始猜是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
,
看英文官方文档头大、根本不知道看哪里
这也是从朋友那里获得的信息,她看英文官方文档
比我擅长太多了
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。