鱼C论坛

 找回密码
 立即注册
查看: 2319|回复: 3

用向量化运算解决小练习结果出现偏差

[复制链接]
发表于 2016-5-11 15:33:37 | 显示全部楼层 |阅读模式
20鱼币
为了20160509的小练习写了个最简单的迭代版本,今天想做一个向量化的计算,希望能提高一些效率,但是结果出现偏差;
自己用较小数列(3到20)一步步debug了一遍也没发现错误在哪里,求诸位大神帮我看看哪里有问题:
  1. import numpy as np
  2. import time

  3. start_t = time.clock()

  4. data = np.arange(3,1000001) #生成数列
  5. chain_len = np.ones((len(data))).astype(int)
  6. while max(data) > 1:
  7.     # 建立对应非1奇数和偶数的mask
  8.     mask_o = np.all([(data %2 ==1), (data != 1)], axis=0)
  9.     mask_e = data %2 == 0
  10.     # 处理奇数
  11.     data[mask_o] = 3 * data[mask_o] + 1
  12.     chain_len[mask_o] += 1
  13.     # 处理偶数
  14.     data[mask_e] = (data[mask_e]/2).astype(int)
  15.     chain_len[mask_e] += 1
  16. print('最长链的长度为%s'%str(max(chain_len)))
  17. print('最长链对应数字为%s'%str(3+np.argmax(chain_len)))
  18. print('用时%s秒'%str(time.clock()-start_t))
复制代码

最佳答案

查看完整内容

我还没接触过numpy,看看谁知道问题所在
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-11 15:33:38 | 显示全部楼层
我还没接触过numpy,看看谁知道问题所在
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-11 19:02:00 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-12 17:49:48 | 显示全部楼层
发现这个问题的原因是我生成的array的默认数据格式是 int32, 最大只能存储到2147483647,当迭代过程中有数字大于这个数之后,就会变成负数,导致结果出现偏差。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-20 23:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表