import numpy as np
创建数组
直接创建
使用当前内存的随机值创建指定形状的矩阵
np.empty([3, 2], dtype=int)
array([[0, 0],
[0, 0],
[0, 0]])
创建全 $1$ 矩阵
np.ones((3, 2), dtype=np.int)
array([[1, 1],
[1, 1],
[1, 1]])
创建全 $0$ 矩阵
np.zeros((2, 3))
array([[0., 0., 0.],
[0., 0., 0.]])
用指定的值 fill_value
填充矩阵
np.full((3, 3), fill_value=-1)
array([[-1, -1, -1],
[-1, -1, -1],
[-1, -1, -1]])
创建单位矩阵
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
从指定范围创建
np.arange 创建序列
np.arange
类似 Python 标准库函数 range
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
可以指定起始值,生成的数范围为左闭右开区间:
np.arange(2, 10)
array([2, 3, 4, 5, 6, 7, 8, 9])
可以指定步长:
np.arange(2, 10, 2)
array([2, 4, 6, 8])
可以指定数据类型:
np.arange(10, dtype=np.float)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
np.linspace 创建等差数列
np.linspace
创建一个由等差数列构成的一维数组
np.linspace(start=0, stop=2*np.pi, num=12)
array([0. , 0.57119866, 1.14239733, 1.71359599, 2.28479466,
2.85599332, 3.42719199, 3.99839065, 4.56958931, 5.14078798,
5.71198664, 6.28318531])
默认情况下 endpoint
参数值为 True
,表示包括右端点。值为 False
时则不包括右端点:
np.linspace(0, 2*np.pi, 11, endpoint=False)
array([0. , 0.57119866, 1.14239733, 1.71359599, 2.28479466,
2.85599332, 3.42719199, 3.99839065, 4.56958931, 5.14078798,
5.71198664])
np.logspace 创建等比数列
np.logspace
和 np.linspace
类似,用于生成等比数列。参数 base
表示底数。
np.logspace(start=0, stop=9, num=10, base=2)
array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
从已有数组创建
通过 Python 基本数据类型创建:
np.array([0, 1, 2, 3])
array([0, 1, 2, 3])
np.array((-1, 1, -2, 2))
array([-1, 1, -2, 2])
np.array([[1, 2], [9, 8], (0.1, 0.2)])
array([[1. , 2. ],
[9. , 8. ],
[0.1, 0.2]])
用 np.asarray
时不会在内存中拷贝副本,而是直接将 Python 基本数据类型转化为 np.ndarray
A = [[1, 2, 3], [4, 5, 6]]
np.asarray(A)
array([[1, 2, 3],
[4, 5, 6]])
可以用参数 order
来指定数组在内存中存储是行优先 C
还是列优先 F
:
np.asarray(A, order='C'), np.asarray(A, order='F')
(array([[1, 2, 3],
[4, 5, 6]]),
array([[1, 2, 3],
[4, 5, 6]]))
根据已有 np.ndarray
的形状生成形状相同的矩阵:
A = np.array([[1, 2], [3, 4], [5, 6]])
np.zeros_like(A), np.ones_like(A), np.full_like(A, 2)
(array([[0, 0],
[0, 0],
[0, 0]]),
array([[1, 1],
[1, 1],
[1, 1]]),
array([[2, 2],
[2, 2],
[2, 2]]))
接受 buffer
输入参数,以流的形式读入转化成 np.ndarray
对象:
s = b'Hello World'
np.frombuffer(s, dtype='S1')
array([b'H', b'e', b'l', b'l', b'o', b' ', b'W', b'o', b'r', b'l', b'd'],
dtype='|S1')
从可迭代对象中建立 np.ndarray
对象,返回一维 np.ndarray
数组:
l = range(5)
it = iter(l)
np.fromiter(it, dtype=float)
array([0., 1., 2., 3., 4.])
ndarray 对象的方法
返回原矩阵重置形状的副本:
A = np.arange(6)
B = A.reshape(3, 2)
A, B
(array([0, 1, 2, 3, 4, 5]),
array([[0, 1],
[2, 3],
[4, 5]]))
直接重置形状而不返回任何值:
A = np.arange(6)
A.resize(2, 3)
A
array([[0, 1, 2],
[3, 4, 5]])
返回原矩阵“拉直”后的副本:
A = np.zeros((2, 2, 3), dtype=np.int32)
B = A.flatten()
A, B
(array([[[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0]]]),
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))
返回原矩阵中每个元素强制类型转换后的副本:
A = np.arange(6)
B = A.astype(np.float32)
A, B
(array([0, 1, 2, 3, 4, 5]), array([0., 1., 2., 3., 4., 5.], dtype=float32))
ndarray 对象的属性
A = np.empty((2, 3, 2), dtype=np.complex)
秩,即轴的数量或维度的数量(非矩阵的秩)
A.ndim
3
形状
A.shape
(2, 3, 2)
元素个数,即形状元组各个分量之积
A.size
12
数据类型
A.dtype
dtype('complex128')
每个元素所占字节数
A.itemsize
16
取实部和虚部
A.real, A.imag
(array([[[6.79038653e-313, 2.37663529e-312],
[2.05833592e-312, 8.48798317e-313],
[1.40051722e-312, 1.37929726e-312]],
[[2.46151512e-312, 8.48798317e-313],
[2.16443571e-312, 2.46151512e-312],
[2.12199579e-313, 1.40051722e-312]]]),
array([[[6.79038653e-313, 2.05833592e-312],
[2.18565567e-312, 8.70018275e-313],
[1.29441743e-312, 2.05833592e-312]],
[[2.37663529e-312, 2.37663529e-312],
[2.35541533e-312, 1.06099790e-312],
[9.33678148e-313, 2.18568966e-312]]]))
内存信息
A.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False