1. numpy 数组
numpy研究的对象就是n维数组,在numpy中,这些数组都属于ndarray类型,意为n-dim数组。由于numpy的高效性,目前已经属于python非标准模块中最重要的模块之一,下面给出一个例子来测试numpy的计算效率。
import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))
%time for _ in range(10): my_arr2 = my_arr * 2
Wall time: 38 ms
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]
Wall time: 785 ms
由此可以看出在执行矩阵的相关计算时,numpy要比传统的python列表至少快一个数量级
2. numpy数组的生成
在numpy中定义了一些生成ndarray类型对象(即numpy数组)的方法:
| 方法名 | 主要功能 |
|---|---|
| array(object) | object一般是序列对象,如列表、元组等 |
| asarray(a) | 将a转换为numpy数组,a一般是列表、元组以及numpy数组等 |
| arange([start, ]stop, [step, ]) | 生成一维数组,类似python中的range |
| ones(shape) | 生成全部是1的数组 |
| ones_like(a) | 生成与a形状相同的全1数组 |
| zeros(shape) | 生成全部是0的数组 |
| zeros_like(a) | 生成与a形状相同的全0数组 |
| empty(shape) | 生成未初始化的数组 |
| empty_like(a) | 生成与a形状相同的未初始化的数组 |
| full(shape, fill_value) | 生成元素全部是fill_value的数组 |
| full_like(a, fill_value) | 生成与a形状相同且元素都是fill_value的数组 |
| eye(N, M=None, k=0) | 生成类似单位矩阵的数组,可视为identity的加强版 |
| identity(n) | 生成n*n的单位矩阵 |
2.1 array与asarray
这两个方法都是将一些(类)数组对象转换为数组对象
np.array([1, 2, 3])
array([1, 2, 3])
np.array((2, 3, 5))
array([2, 3, 5])
np.asarray(np.array([1.2, 2.3, 2.1]))
array([1.2, 2.3, 2.1])
2.2 arange
arange用来生成一维序列型数组,类似与python3中的range
arange([start, ]stop, [step])start为序列的起始值,缺省为0stop为序列的结束值(不能取到)step为步长,缺省为1
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
np.arange(2, 8, 2)
array([2, 4, 6])
np.arange(10, 1, -3)
array([10, 7, 4])
2.3 ones,ones_like,zeros,zeros_like,empty,empty_like
ones, zeros, empty分别生成全1、全0、全部未定义的数组,数组的尺寸由参数shape确定
ones_like, zeros_like, empty_like分别生成全1、全0、全部未定义的数组,数组的尺寸与数组a相同
需要注意的是,由
empty和empty_like生成的数组中的元素未定义,显示出来的数值只是随机给出的,不能直接使用
arr = np.ones((3, 4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
np.zeros_like(arr)
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
2.4 full与full_like
3中的方法将数组中的所有元素都设置为0,1等比较 特殊的数值,而full方法可以将数组以任意数值填充。
full(shape, fill_value)
full_like(a, fill_value)
shape为数组的形状a为数组fill_value为填充值
np.full((3, 6), 6)
array([[6, 6, 6, 6, 6, 6],
[6, 6, 6, 6, 6, 6],
[6, 6, 6, 6, 6, 6]])
2.5 eye与identity
identity(n)
- 生成
n*n的单位矩阵(主对角线上的元素为1,其余位置上的元素为0)
np.identity(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
eye(N, M=None, k=0)
- 生成
N*M的数组,一些元素是1,一些元素是0
当k=0时,主对角线上的元素为1,其余位置上的元素为0
当k>0时,主对角线向右上方平行移动k个单位,到达位置的元素为1,其余位置上的元素为0
当k<0时,主对角线向左下方平行移动k个单位,到达位置的元素为1,其余位置上的元素为0
- 当
M=None时,生成N*N的数组 eye可以视为加强版的identity
np.eye(4, 6)
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.]])
np.eye(4, 6, 1)
array([[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.]])