第一次翻译文档, 难免有很多纰漏, 敬请斧正哟~并且由于太长, 就一点一点翻译啦.

原文地址: https://docs.scipy.org/doc/numpy-1.13.0/user/quickstart.html#an-example

快速入门

先决要求

在你阅读本教程之前你应该对 Python 有所了解. 如果你想要唤醒一下你的记忆, 去看看 Python tutorial 吧.

如果你想亲手试试本教程中的例子的话, 你也必须先在你的电脑上安装一些软件. 请看 http://scipy.org/install.html 中的说明.

基础知识

NumPy 的主要对象是齐次高维数组(homogeneous multidimensional array). 它是一个由一些相同类型的元素(通常是数)组成的表, 由一个正整数元组来索引. 在 Numpy 中维度(dimensions)被称为 轴(axes) , 轴数则被称为 阶(rank).

例如, 一个三维空间中的点的坐标 [1, 2, 1] 是一个一阶的序列(array), 因为它有一个轴. 这个轴的长度为 3. 下面展示的这个例子中, 这个序列的阶数为2(它有2个维度). 第一个维度(轴)的长度为2, 第二个维度的长度为3.

[[1., 0., 0.],
[0., 1., 2.]]

NumPy 的序列类被称为 ndarray. 他也有另一个常见的别名 array. 请记住 numpy.array 是不同于 Python 标准库中的 array.array 类的, 后者只能处理一维的序列并且功能较少. 一个 ndarray 所具有的更重要的属性包括:

ndarray.ndim

  • array 的轴数(维数). 在 Python 世界中, 维数通常被称为阶(rank).

ndarray.shape

  • array 的尺寸(dimensions). 它通常是一个表示各个维度上 array 长度(size)的整数元组. 对于一个 n 行 m 列的矩阵来说, shape就是 (n,m). shape 的长度就等于阶, 也就是维数, 即上面提到的ndim.

ndarray.size

  • 整个 array 的元素数. 它等于 shape 中各元素的积.

ndarray.dtype

  • 一个描述 array 中元素类型的对象. 你可以用 Python 的基本类型定义或者指定一个 dtype. 另外, NumPy 也提供自带的一些类型, 比如 numpy.int32, numpy.int16, numpy.float64等.

ndarray.itemsize

  • array 中每个元素的大小(size). 例如, 一个由 float64 类型的元素组成的 array, 它的 itemsize 就是 8(=64/8), 而一个由 complex32 类型组成的 array 的 itemsize 则是4(=32/8). 它就等于 ndarray.dtype.itemsize.

ndarray.data

  • 承载实际元素的缓冲区(buffer). 一般而言, 我们不需要用到这个属性, 因为我们会通过索引来访问元素.

一个例子:

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>

创建一个 array

创建 array 有几种方式.

比如, 你可以通过 array 函数用常规的 Python 列表或者元组来创建一个 array. 这样生成的 array 的类型是由序列中的元素转化得到的.

>>> import numpy as np
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

一个常见错误是使用多个数值作为参数来调用 array 函数, 而不是提供一个由数组成的列表作为参数.

>>> a = np.array(1,2,3,4)    # WRONG
>>> a = np.array([1,2,3,4])  # RIGHT

array 函数会把序列组成的序列转化为二维的 array, 序列组成的序列组成的序列则转化为三维的 array, 以此类推.

>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])

array 的类型也可以在创建时指定:

>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])

经常我们在一开始并不知道 array 中的元素, 但是元素的大小是知道的. 因此, NumPy 提供了数个函数来创建由占位符组成的 array, 这样使得可增长 array 的必要性最小化, 而使用可增长 array 是一各代价高昂的操作.

zeros 函数能创建一个全由 0 组成的 array, ones 函数能创建一个全由 1 组成的 array, 而 empty 函数的则会创建一个由内存状态生成的随机数填充的 array. 在默认的情况下, 这样创建的 array 的dtype 是 float64

>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int16)
>>> np.empty( (2,3) )                                 # uninitialized, output may vary
array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],
       [  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

为了创建一个数列, NumPy 提供了一个类似 range 的函数来返回一个 array 而不是列表(list)

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])

arange 的参数是浮点数时, 一般不可能预测得到的元素是什么, 因为浮点数的精度是有限的. 因此, 通常使用 linspace 是一个更好的选择, linspace 函数会接受我们想得到的元素数作为参数, 而不是步长(step):

>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
>>> f = np.sin(x)

参考:

array, zeros, zeros_like, ones, ones_like, empty,empty_like, arange, linspace, numpy.random.rand, numpy.random.randn, fromfunction, fromfile