numpy研究总结
import numpy as np
np.__version__
'1.14.0'

创建

numpy.array

nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr[5]
5
nparr.dtype
dtype('int32')
nparr2 = np.array([1, 2, 3.0])
nparr2.dtype
dtype('float64')

numpy.array其他创建方式

np.zeros(10, dtype = int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros(shape = (3,5), dtype = int)
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])
np.ones(10, dtype = int)
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
np.ones(shape = (3,5), dtype = int)
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])
np.full(shape = (3,5), fill_value = 666)
array([[666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666]])

numpy.arange

np.arange(0, 20, 2) # 用法同range()
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
np.arange(1, 5, 0.5) # 可以设置步长为浮点数
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])

numpy.linspace

np.linspace(0, 20, 11) # 0 到 20 等长的截取出 11个点
array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.])

numpy.random

np.random.randint(0, 10) # 0 到 10 随机数
3
np.random.randint(0, 10, size = 5) # 0 到 10 5个随机数
array([1, 7, 9, 4, 9])
np.random.randint(0, 10, size = (3, 5)) # 0 到 10 5个随机数
array([[5, 6, 5, 5, 5],
       [0, 0, 8, 0, 6],
       [8, 7, 0, 3, 9]])
np.random.seed(123) # 设置随机种子
np.random.randint(0, 10, size = (3, 5)) # 0 到 10 5个随机数
array([[2, 2, 6, 1, 3],
       [9, 6, 1, 0, 1],
       [9, 0, 0, 9, 3]])
np.random.random() # 0 到 1 随机数
0.24475927695391986
np.random.random(10) # 0 到 1 10个随机数
array([0.69475518, 0.5939024 , 0.63179202, 0.44025718, 0.08372648,
       0.71233018, 0.42786349, 0.2977805 , 0.49208478, 0.74029639])
np.random.random((3, 5)) # 0 到 1 矩阵随机数
array([[0.35772892, 0.41720995, 0.65472131, 0.37380143, 0.23451288],
       [0.98799529, 0.76599595, 0.77700444, 0.02798196, 0.17390652],
       [0.15408224, 0.07708648, 0.8898657 , 0.7503787 , 0.69340324]])
np.random.normal() # 均值为0,方差为1 的正态分布的随机数
-3.055577417640911
np.random.normal(10, 100) # 均值为10,方差为100 的正态分布的随机数
-166.50564344909273
np.random.normal(0, 1, (3, 5)) # 均值为0,方差为1 的正态分布的随机数矩阵
array([[ 0.73860005, -0.50777635,  0.22799089, -1.74042135, -0.5345051 ],
       [-0.93774867, -1.48630088, -0.02936315, -1.23714237,  0.07598604],
       [-1.94519772, -0.23484041, -1.81456729,  0.05963647, -0.39763149]])

操作

numpy.array

X = np.arange(15).reshape(3, 5)
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

基本属性

X.ndim # 维数
2
X.shape
(3, 5)
X.size
15

数据访问

X[0]
array([0, 1, 2, 3, 4])
X[0][1] # 对于切片操作有问题
1
X[(0, 1)]
1
X[-1,-1] # 建议
14
X[:2, :3] # 前2行3列
array([[0, 1, 2],
       [5, 6, 7]])
X[::-1, ::-1] # 反转矩阵
array([[14, 13, 12, 11, 10],
       [ 9,  8,  7,  6,  5],
       [ 4,  3,  2,  1,  0]])
X[:, 0] # 取一列
array([ 0,  5, 10])
subX = X[:2, :3].copy() # 深拷贝
subX
array([[0, 1, 2],
       [5, 6, 7]])

reshape

X.reshape(5, 3) # 重置维度
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])
X.reshape(1, -1) # 重置维度 不考虑为 -1
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]])

合并操作

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
np.concatenate([x, y])
array([1, 2, 3, 4, 5, 6])
np.concatenate([X, X]) # 只能拼接相同维数的矩阵
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
np.concatenate([X, X], axis = 1) # axis 为拼接方向 默认为0 
array([[ 0,  1,  2,  3,  4,  0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 10, 11, 12, 13, 14]])
np.vstack([x, y]) # 参数为列表 垂直拼接
array([[1, 2, 3],
       [4, 5, 6]])
np.hstack([x, y])
array([1, 2, 3, 4, 5, 6])

分割操作

z = np.arange(10)
np.split(z, [3, 7]) # 第二个参数为分割点
[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]
np.split(X, [1], axis = 1) # 水平分割矩阵
[array([[ 0],
        [ 5],
        [10]]), array([[ 1,  2,  3,  4],
        [ 6,  7,  8,  9],
        [11, 12, 13, 14]])]
np.vsplit(X, [2]) # 垂直分割矩阵
[array([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]]), array([[10, 11, 12, 13, 14]])]
np.hsplit(X, [2]) # 水平分割矩阵
[array([[ 0,  1],
        [ 5,  6],
        [10, 11]]), array([[ 2,  3,  4],
        [ 7,  8,  9],
        [12, 13, 14]])]

运算

a = 2 * x
a
array([2, 4, 6])

Universal Functions

a + 1
array([3, 5, 7])
a - 2
array([0, 2, 4])
a // 2
array([1, 2, 3], dtype=int32)
a ** 2
array([ 4, 16, 36], dtype=int32)
np.abs(a)
array([2, 4, 6])
np.sin(a)
array([ 0.90929743, -0.7568025 , -0.2794155 ])
a * x
array([ 2,  8, 18])
b = x.reshape(3,1)
b.dot(y.reshape(1,3)) # 点乘
array([[ 4,  5,  6],
       [ 8, 10, 12],
       [12, 15, 18]])
X.T # 转置矩阵
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

向量和矩阵运算

v = np.array([1,2]) # 维数 自动匹配
b + v
array([[2, 3],
       [3, 4],
       [4, 5]])
np.tile(v, (2, 3)) # 堆叠
array([[1, 2, 1, 2, 1, 2],
       [1, 2, 1, 2, 1, 2]])
A = np.tile(v, (2, 1))
np.linalg.inv(A) # 逆矩阵
np.linalg.pinv(A) # 伪逆矩阵
array([[2, 3],
       [2, 3]])

聚合操作

np.sum(a) # 矩阵求和
12
np.min(a)
2
np.max(a)
6
np.sum(X, axis = 0) # 矩阵每列求和
array([15, 18, 21, 24, 27])
np.sum(X, axis = 1) # 矩阵每行求和
array([10, 35, 60])
np.prod(a) # 矩阵求积
48
np.mean(a) # 平均值
4.0
np.median(a) # 中位数
4.0
np.percentile(a, q = 50) # 百分位
4.0
np.var(a) # 方差
2.6666666666666665
np.std(a) # 标准差
1.632993161855452

索引

np.argmin(a) # 最小值的索引
0
np.argmax(a) # 最大值的索引
2
np.argsort(a) # 排序
array([0, 1, 2], dtype=int64)
np.partition(a, 1) # 分区 
array([2, 4, 6])

Fancy Indexing

l = np.arange(10)
ind = [2, 3, 5]
l[ind]
array([2, 3, 5])
row = np.array([0, 1, 2])
col = np.array([1, 2, 3])
X[row, col]
array([ 1,  7, 13])
col = [True, False, True, True, True]
X[:2, col]
array([[0, 2, 3, 4],
       [5, 7, 8, 9]])
X < 5
array([[ True,  True,  True,  True,  True],
       [False, False, False, False, False],
       [False, False, False, False, False]])
np.sum(X<5) # 小于5的数之和
5
np.any(X == 0) # 是否含有0
True
np.all(X == 0) # 是否都是0
False