파이썬은 정수와 데이터 오버 플로우 NumPy와이다

급우 누군가가 나에게 총을 보내고, 부정적인 결과가 왜 물어?

지도를 읽고, 내 첫 느낌은 데이터 오버 플로우입니다. 데이터 이상한 결과가있을 것, 표현 될 수있는 최대 값을 초과한다.

그리고, 그 장 맵을 계속 전송 콘텐츠 인쇄 (* 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进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。

추천

출처www.cnblogs.com/pythonista/p/11503117.html