급우 누군가가 나에게 총을 보내고, 부정적인 결과가 왜 물어?
지도를 읽고, 내 첫 느낌은 데이터 오버 플로우입니다. 데이터 이상한 결과가있을 것, 표현 될 수있는 최대 값을 초과한다.
그리고, 그 장 맵을 계속 전송 콘텐츠 인쇄 (* 208378 100000), 그것은 정확한 결과지도에 직접 인쇄 E [0] * G [0], 결과 20,837,800,000되어있다.
그래서 새로운 질문은 : 맵의 데이터가 오버 플로우, 왜 직접 오버 플로우의 수를 곱한하지 않았다?
나는 데이터의 표현의 규칙을 무시 되었기 때문에, 그러나 또한 NumPy와는 많이 알지 위해 (정수 제한은 얼마?입니다)뿐만 아니라 잘못된 데이터의 각 오인 잘못된 그림의 결과를보고, 그래서 그것을 대답하지 않습니다.
마지막으로, 논의의 그룹을 공부 한 후, 나는 마침내 그것이 얼마나 이해하고, 그래서이 관련 지식 포인트는 빗질 할 수 있습니다.
공식 시작하기 전에, 먼저 주제는지도에 그려집니다 요약한다
- 파이썬 3의 정수의 상한은 얼마입니까? 파이썬이 그것?
- 수는 상한 NumPy와 정수입니까? 정수 오버 플로우는 어떻게 할까?
첫 번째 질문에, 파이썬 2에서 살펴보고, 두 개의 정수를 가지고 :
- 하나는 짧은 정수, 또는 종종 있다고 정수는, INT로 표현된다, 거기에 내장 함수 INT ()입니다. 제한된 크기, 수
sys.maxint()
볼 (플랫폼에 의존하는 32 비트 또는 64 비트) - 하나 즉, 무한 정수의 크기는, 길이가 긴 표시되는 정수이며, 긴 내장 된 기능이있다 (). 이러한 수는 1000L로 증가 소문자의 L 또는 L에 기록되면
경우 짧은 정수 범위 밖에 정수, 자동 긴 정수를 사용한다. 예를 들어, 인쇄 2**100
최종 결과 긴 정수 문자 L로 표시한다.
그러나 파이썬 3에서는 상황이 다르다 : 그것은 단지 하나의 내장 정수, 그것은 INT, 공식적으로 파이썬 짧은 정수로 표현하지만, 사실 그것은 더 긴 정수처럼 행동의 무한한 범위를 나타냅니다. 아무리 숫자, 문자 L의 끝이 구별을 할 필요가 없어요.
즉 파이썬 3는 기본 수요 처리에 두 개의 정수 표현, 사용자가 더 이상 자신을 구별 할 필요가 없습니다, 모두를 실현이다.
理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解释了前文中直接打印两数相乘,为什么结果会正确了。
PEP-237(Unifying Long Integers and Integers)中对这个转变作了说明。它解释这样做的 目的:
这会给新的 Python 程序员(无论他们是否是编程新手)减少一项上手前要学的功课。
Python 在语言运用层屏蔽了很多琐碎的活,比如内存分配,所以,我们在使用字符串、列表或字典等对象时,根本不用操心。整数类型的转变,也是出于这样的便利目的。(坏处是牺牲了一些效率,在此就不谈了)
回到前面的第二个话题:Numpy 中整数的上限是多少?
由于它是 C 语言实现,在整数表示上,用的是 C 语言的规则,也就是会区分整数和长整数。
有一种方式可查看:
import numpy as np
a = np.arange(2)
type(a[0])
# 结果:numpy.int32
也就是说它默认的整数 int 是 32 位,表示范围在 -2147483648 ~ 2147483647。
对照前文的截图,里面只有两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以出现奇怪的负数结果。
Numpy 支持的数据类型要比 Python 的多,相互间的区分界限很多样:
截图来源:https://www.runoob.com/numpy/numpy-dtype.html
要解决整数溢出问题,可以通过指定 dtype 的方式:
import numpy as np
q = [100000]
w = [500000]
# 一个溢出的例子:
a = np.array(q)
b = np.array(w)
print(a*b) # 产生溢出,结果是个奇怪的数值
# 一个解决的例子:
c = np.array(q, dtype='int64')
d = np.array(w, dtype='int64')
print(c*d) # 没有溢出:[50000000000]
好了,前面提出的问题就回答完了。来作个结尾吧:
- Python 3 极大地简化了整数的表示,效果可表述为:整数就只有一种整数(int),没有其它类型的整数(long、int8、int64 之类的)
- Numpy 中的整数类型对应于 C 语言的数据类型,每种“整数”有自己的区间,要解决数据溢出问题,需要指定更大的数据类型(dtype)
公众号【Python猫】, 本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。