模块提供了高效、便捷的numpy Python大数值数组的处理。它的前身是无论是早前的数字和替代Numarray模块。(见附录A中更多的科学计算与Python。史)的NumPy模块使用的许多其他的库和项目,在这个意义上是一个“基地”技术。
让我们在钻研深入技术细节的一些例子看。
一、NumPy in Action
对象的类型是ndarray NumPy。创造它们有不同的方式。我们可以创建一个ndarray的:
- 转换Python列表
- 使用函数返回一个密集的载体
- 从文件直接进入NumPy对象读取数据
清单显示五种不同的方法来创建NumPy对象。首先我们创建一个通过将Python列表。然后,我们展示了两个不同工厂的例程生成等距网格点。这些例程在解释所提供的边界值时各不相同:一个例程包含两个边界值,另一个包含一个边界值,而不包含另一个边界值。接下来我们创建一个填充零矢量和循环中的每个元素的集合。最后,我们从文本文件中读取数据。(这里我只展示了最简单或默认的情况,所有这些例程都有更多的选项可以用来影响他们的行为。)
# Five different ways to create a vector...
import numpy as np
# From a Python list
vec1 = np.array( [ 0., 1., 2., 3., 4. ] )
# arange( start inclusive, stop exclusive, step size )
vec2 = np.arange( 0, 5, 1, dtype=float )
# linspace( start inclusive, stop inclusive, number of elements )
vec3 = np.linspace( 0, 4, 5 )
# zeros( n ) returns a vector filled with n zeros
vec4 = np.zeros( 5 )
for i in range( 5 ):
vec4[i] = i
# read from a text file, one number per row
vec5 = np.loadtxt( "data" )
最后,所有的五个向量包含相同的数据。你应该注意,用来初始化vec1 Python列表的值是浮点值,我们指定的向量元素显式使用时arange()函数创建vec2类型。(我们一会儿就回来。)
现在我们已经创建了这些对象,我们可以与他们(见下列表)。一个由NumPy提供的主要设备是我们可以像他们的原子数据类型使用numpy对象:我们可以添加、删减和增加他们(等等)而不需要显式的循环。避免显式的循环使得我们的代码更清晰。它也使它更快(因为整个操作是在C中执行的,没有开销)请参见下面的讨论)。
# ... continuation from previous listing
# Add a vector to another
v1 = vec1 + vec2
# Unnecessary: adding two vectors using an explicit loop
v2 = np.zeros( 5 )
for i in range( 5 ):
v2[i] = vec1[i] + vec2[i]
# Adding a vector to another in place
vec1 += vec2
# Broadcasting: combining scalars and vectors
v3 = 2*vec3
v4 = vec4 + 3
# Ufuncs: applying a function to a vector, element by element
v5 = np.sin(vec5)
# Converting to Python list object again
lst = v5.tolist()
所有操作都是按元素执行的:如果我们添加两个向量,那么每个向量的对应元素将被组合起来,以得到结果向量中的元素。换句话说,紧凑的表达vec1 + vec2为V1在上市相当于用来计算V2显式线圈结构。这是乘法是真实的:vec1 * vec2将导致载体的两个操作数的对应元素已增加元素的元素。(如果你想要一个真正的载体或“点”的产品,你必须使用dot()函数代替。)显然,这需要所有操作数具有相同数量的元素!
>>> import numpy as np
>>> # Create a 12-element vector and reshape into 3x4 matrix
>>> d = np.linspace( 0, 11, 12 )
>>> d.shape = ( 3,4 )
>>> print d
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
>>> # Slicing...
>>> # First row
>>> print d[0,:]
[ 0. 1. 2. 3.]
>>> # Second col
>>> print d[:,1]
[ 1. 5. 9.]
>>> # Individual element: scalar
>>> print d[0,1]
1.0
>>> # Subvector of shape 1
>>> print d[0:1,1]
[ 1.]
>>> # Subarray of shape 1x1
>>> print d[0:1,1:2]
[[ 1.]]