我正在阅读以下Python文档:
https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.prod.html
注释
使用整数类型时算术是模块化的,并且不会引发错误 在溢出。这意味着在32位平台上:
>>> x = np.array([536870910, 536870910, 536870910, 536870910]) >>> np.prod(x) # random 16
有人可以解释使用整数类型时算术是模块化的意思吗?如果我有32位或64位平台,这又有什么关系?
答案 0 :(得分:1)
Wiki页面解释了模块化算术,但与numpy无关。
numpy整数可以使用8、16、32或64位进行签名或取消签名。
Range signed Range unsigned
8 bit -128 to 127 0 to 255 0 to 2**8-1
16 bit -32768 to 32767 0 to 65535 0 to 2**16-1
32 bit -2**31 to 2**31-1 0 to 2**32-1 Decimal 9 digits
64 bit -2**64 to 2**64-1 0 to 2**64-1 Decimal 18/19 digits
最简单的显示np.int8。仅有256种可能的值。
import numpy as np
a=np.arange(256, dtype=np.int8)
print(a)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 -128 -127 -126 -125 -124 -123 -122
-121 -120 -119 -118 -117 -116 -115 -114 -113 -112 -111 -110 -109 -108 -107
-106 -105 -104 -103 -102 -101 -100 -99 -98 -97 -96 -95 -94 -93 -92
-91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80 -79 -78 -77
-76 -75 -74 -73 -72 -71 -70 -69 -68 -67 -66 -65 -64 -63 -62
-61 -60 -59 -58 -57 -56 -55 -54 -53 -52 -51 -50 -49 -48 -47
-46 -45 -44 -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -32
-31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17
-16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1]
由8位> 127表示的数字为负。
np.binary_repr(127, 8)
Out[11]: '01111111'
np.binary_repr(-128, 8)
Out[12]: '10000000'
如果设置了位7,则表示为负整数。
使用np.int8播放一些数字。
np.int8(17*18) # Out[29]: 50
17*18 % 256 # Out[30]: 50 (17*18=306) Mod 256 = 50
np.int8(17*180) # Out[31]: -12
17*180 % 256 # Out[32]: 244
np.binary_repr(244, 8) # Out[33]: '11110100'
np.binary_repr(-12, 8) # Out[34]: '11110100'
文档说,如果整数算术溢出,它只会环绕数字范围,而不会引发异常。用模块替换“环绕”。
如果确实发生溢出,则只会产生令人惊讶的(并且可能是错误的)结果。
这给出了一个简短的概述。使用np.int8(expr)
和np.binary_repr( n, 8)
到处玩,看看发生了什么。
编辑以解释第7位
Bit numbers 7 6 5 4 3 2 1 0
127 0 1 1 1 1 1 1 1 Bit 7 not set 0 +127
-128 1 0 0 0 0 0 0 0 Bit 7 set 1 -128
-1 1 1 1 1 1 1 1 1