Numpy 寻找勾股数

寻找勾股数,勾股数即毕氏三元数(Pythagorean triple),有关勾股数的更多信息请见维基百科页面http://en.wikipedia.org/wiki/Pythagorean_triple。勾股数和勾股定理(毕式定理)是紧密相关的。想必你在中学时代的几何课中,已经学过勾股定理了。

构成勾股数的三个自然数分别代表直角三角形的三条边,因此遵守勾股定理。本例将寻找三个自然数的和等于1000的勾股数,这需要用到欧几里得公式:

寻找勾股数

我们将在本例中看到几个通用函数的实际运用。

具体步骤

欧几里得公式定义了索引m和n。

  1. 创建数组m和数组n。

创建数组,用来存放索引。

m = numpy.arange(33)
n = numpy.arange(33)
  1. 计算勾股数的构成元素a、b和c。

使用欧几里得公式,计算勾股数的构成元素a、b和c。对数组进行求积、求差和求和运算时,需要用到outer函数。

a = numpy.subtract.outer(m ** 2, n ** 2)
b = 2 * numpy.multiply.outer(m, n)
c = numpy.add.outer(m ** 2, n ** 2)
  1. 找到符合要求的索引。

现在已经生成了分别包含勾股数的构成元素a、b和c的三个数组。需要进一步寻找符合要求的勾股数。使用NumPy的where函数,可以获得符合要求的勾股数的索引。

idx = numpy.where((a + b + c) == 1000)
  1. 检查得到的结果。

用numpy.testing模块检查得到的结果。

numpy.testing.assert_equal
   (a[idx]**2 + b[idx]**2, c[idx]**2)

本攻略的完整代码如下。

import numpy
import numpy.testing

#勾股数(毕氏三元数)由三个自然数a、b、c构成,并且满足条件a<b<c
#a ** 2 + b ** 2 = c ** 2
#
#例如,3**2 + 4**2 = 9 + 16 = 25 = 5**2.
#
#有且仅有一个勾股数满足条件a + b + c = 1000。
#找到这个勾股数,并计算其构成元素的乘积。

#1. 创建数组m和数组n
m = numpy.arange(33)
n = numpy.arange(33)

#2. 计算勾股数的构成元素a、b和c
a = numpy.subtract.outer(m ** 2, n ** 2)
b = 2 * numpy.multiply.outer(m, n)
c = numpy.add.outer(m ** 2, n ** 2)

#3. 找到符合要求的索引
idx =  numpy.where((a + b + c) == 1000)

#4. 检查得到的结果
numpy.testing.assert_equal(a[idx]**2 + b[idx]**2, c[idx]**2)
print a[idx] * b[idx] * c[idx]

攻略小结

通用函数Ufuncs不是一般意义上的函数,实际上是具备函数功能的对象。正如我们在本例中所见,Ufuncs对象中有一个outer方法。NumPy中标准的Ufuncs很多是用C语言实现的,因此其运算速度比常规的Python代码要快。Ufuncs支持对元素的逐个处理和类型转换,这实际上意味着能减少循环语句的使用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程