po-co 2022-01-25 23:59 采纳率: 85.7%
浏览 25
已结题

为什么返回的不是单位矩阵

img


为什么前两行可以是1,而后两行没有1
返回的不应该是一个单位矩阵吗

  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-01-26 04:27
    关注

    后两行的两个数值实际上是小于1的,所以转成 int32 时被截断变成了0。
    因为在打印numpy.ndarray变量时,默认只保留到小数点后8位,但实际存储的数值的精度可能不止8位。这样打印出来的数值和实际存储的数值不一致。显示时的精度可以通过np.set_printoptions()函数来设置precision参数,默认precision=8。
    举个例子,如果是0.999999999(小数点后有9位),打印数组a时会显示 1. ,打印元素a[0]时则会显示 0.999999999 。

    >>> a = np.array([0.999999999, 1.000000000, 0.123456789])
    >>> a
    array([1.        , 1.        , 0.12345679])
    >>> a[0], a[1], a[2]
    (0.999999999, 1.0, 0.123456789)
    >>> a.astype(np.int32)
    array([0, 1, 0])
    >>> type(a), type(a[0])
    (<type 'numpy.ndarray'>, <type 'numpy.float64'>)
    

    修改precision参数以后:

    >>> np.set_printoptions(precision=10)
    >>> a = np.array([0.999999999, 1.000000000, 0.123456789])
    >>> a
    array([0.999999999, 1.         , 0.123456789])
    

    建议类型转换前先进行舍入操作:

    >>> a = np.array([0.999999999, 1.000000000, 0.123456789])
    >>> np.around(a)
    array([1., 1., 0.])
    >>> np.around(a).astype(np.int32)
    array([1, 1, 0])
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月3日
  • 已采纳回答 1月26日
  • 创建了问题 1月25日

悬赏问题

  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单