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
为序列的起始值,缺省为0
stop
为序列的结束值(不能取到)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.]])