python - 为什么 numpy 的按位左移在不同的系统上会给出不同的结果?
问题描述
我在两个不同的系统上使用 numpy 的按位运算并得到不同/不一致的结果。经过一番调查,我发现这是left_shift
导致问题的原因。如果我执行以下操作:
xs = [i for i in range(100)]
np.left_shift(xs, xs)
在我得到的第一个系统上:
array([ 0, 2, 8,
24, 64, 160,
384, 896, 2048,
4608, 10240, 22528,
49152, 106496, 229376,
491520, 1048576, 2228224,
4718592, 9961472, 20971520,
44040192, 92274688, 192937984,
402653184, 838860800, 1744830464,
3623878656, 7516192768, 15569256448,
32212254720, 66571993088, 137438953472,
283467841536, 584115552256, 1202590842880,
2473901162496, 5085241278464, 10445360463872,
21440476741632, 43980465111040, 90159953477632,
184717953466368, 378231999954944, 774056185954304,
1583296743997440, 3236962232172544, 6614661952700416,
13510798882111488, 27584547717644288, 56294995342131200,
114841790497947648, 234187180623265792, 477381560501272576,
972777519512027136, 1981583836043018240, 4035225266123964416,
8214565720323784704, -1729382256910270464, -2882303761517117440,
-4611686018427387904, -6917529027641081856, -9223372036854775808,
-9223372036854775808, 64, 130,
264, 536, 1088,
2208, 4480, 9088,
18432, 37376, 75776,
153600, 311296, 630784,
1277952, 2588672, 5242880,
10616832, 21495808, 43515904,
88080384, 178257920, 360710144,
729808896, 1476395008, 2986344448,
6039797760, 12213813248, 24696061952,
49928994816, 100931731456, 204010946560,
412316860416, 833223655424, 1683627180032,
3401614098432])
在第二个系统上,我得到:
array([ 0, 2, 8,
24, 64, 160,
384, 896, 2048,
4608, 10240, 22528,
49152, 106496, 229376,
491520, 1048576, 2228224,
4718592, 9961472, 20971520,
44040192, 92274688, 192937984,
402653184, 838860800, 1744830464,
3623878656, 7516192768, 15569256448,
32212254720, 66571993088, 137438953472,
283467841536, 584115552256, 1202590842880,
2473901162496, 5085241278464, 10445360463872,
21440476741632, 43980465111040, 90159953477632,
184717953466368, 378231999954944, 774056185954304,
1583296743997440, 3236962232172544, 6614661952700416,
13510798882111488, 27584547717644288, 56294995342131200,
114841790497947648, 234187180623265792, 477381560501272576,
972777519512027136, 1981583836043018240, 4035225266123964416,
8214565720323784704, -1729382256910270464, -2882303761517117440,
-4611686018427387904, -6917529027641081856, -9223372036854775808,
-9223372036854775808, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0])
因此,如您所见,在某些情况下,结果会变得不一致。有谁知道是什么原因造成的?
添加
“不同的系统”是指不同的计算机。第一台计算机有 numpy 1.15.1,第二台计算机有 1.15.2。
解决方案
旧版本的 NumPy 没有定义移位运算符在尝试移位 >= 类型宽度时的作用。他们基本上只是将语义委托给 C 移位运算符,对于它来说这是未定义的行为。根据硬件和编译器细节,几乎任何事情都可能发生(理论上包括崩溃、安全问题和任意其他不当行为)。
这在 1.18 中有所更改,但您的 NumPy 版本比这更旧。
如果您想要定义的行为,请不要尝试进行这样的转变。
推荐阅读
- ruby-on-rails - Ruby on Rails 6 Turbolinks Stripe 表单值不会保留在背面
- java - 无法解包客户端发送的请求。尽管我能够向他们的服务器发送成功的请求,但它一直在抱怨我的打包程序
- javascript - javascript:结束和开始日期控制
- r - 用R中的for循环计算平均值
- r - 删除 R 中不以模式开头的所有内容
- python - 创建包含重复项的列表
- arrays - JSON 字符串到 SQL
- rust - Libssh2 停止读取大文件
- javascript - 在显示多个世界副本时只渲染 Mapbox 功能一次?
- java - 使用输入按钮将文本从 JTextfield 发送到另一个 Jtextfield