1 基本矩阵操作
1.1 纵向连接矩阵,np.r_([a,b])
纵向连接两个矩阵,就是把两矩阵上下相连,要求列数相等,类似于pandas中的concat()。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.r_[a,b])
## answer ##
[[1 4]
[2 5]
[3 6]]
1.2 横向连接矩阵,np.c_([a, b])
横向连接两个矩阵,就是把两矩阵左右相连,要求行数相等,类似于pandas中的merge()。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.c_[a,b])
## answer ##
[1 2 3 4 5 6]
2 随机数
2.0 设置随机数种子
- 有时候我们想每次生成的随机数矩阵都一样,这时只需在前面加一句np.random.seed(0)即可,数字可随意指定
2.1 生成随机浮点数,np.random.random()
np.random.random()
Out[19]: 0.7954041994194649
2.2 生成随机数组,np.random.rand(100,1)
np.random.rand(100,1) # 数组大小为 100*1
2.3 生成一个随机数
np.random.uniform() # 默认为0到1
3 线性代数 linalg
3.1 计算矩阵的逆,np.linalg.inv(matrix)
np.linalg.inv(matrix)
4 数组操作
4.1 计算数组的内积与矩阵积,np.dot(a, b)
如果处理的是一维数组,则得到的是两数组的內积
如果是二维数组(矩阵)之间的运算,则得到的是矩阵积(matrix product),即列数与行数相同两矩阵相乘
dot()函数可以通过numpy库调用,也可以由数组实例对象进行调用。a.dot(b) 与 np.dot(a,b)效果相同
a = np.array([1,1])
b = np.array([2,2])
np.dot(a,b)
# Out[28]: 4
b = np.array([[2,2], [2,2]])
a = np.ones((2,2))
np.dot(a,b)
## answer ##
Out[32]:
array([[4., 4.],
[4., 4.]])
4.2 重组数组,np.reshape(a, newshepe)
- 在不更改数据的情况下为数组赋予新的形状
- 可以通过numpy库调用,也可以由数组实例对象进行调用。a.reshape((4,4)) 与 np.reshape(a,(4,4))效果相同
- 其他用法
# 不知道z的shape属性是多少,让z变成一列
z = z.reshape(-1,1)
# 只给定行数,列数等于-1,让z变成指定行数
z = z.reshape(rows,-1)
- PS:产生新的数组,需要赋值给原来数组才能完成修改
4.3 创建数组,np.array()
- 例子
>>> np.array([1, 2, 3])
array([1, 2, 3])
- 向上转型:
>>> np.array([1, 2, 3.0])
array([ 1., 2., 3.])
- 一个以上的维度:
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
[3, 4]])
- 最小尺寸2:
>>> np.array([1, 2, 3], ndmin=2) // 原本是一维数组
array([[1, 2, 3]])
- 提供的类型:
>>> np.array([1, 2, 3], dtype=complex)
array([ 1.+0.j, 2.+0.j, 3.+0.j])
- 数据类型包含多个元素:
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
# 'a', 'b'分别代表元组两个元素的名称
>>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])
>>> x['a']
array([1, 3])
- 从子类创建数组:
>>> np.array(np.mat('1 2; 3 4'))
array([[1, 2],
[3, 4]])
# subok: bool,可选,如果为True,则将传递子类,否则返回的数组将被强制为基类数组(默认)。
>>> np.array(np.mat('1 2; 3 4'), subok=True)
matrix([[1, 2],
[3, 4]])
4.4 按数值范围创建数组,numpy.arange(start, stop, step, dtype)
4.5 比较数组的相同个数,numpy.sum(arr1 == arr2)
4.6 从数组中随机抽样,np.randon.choice() 与 np.random.sample()
numpy.random.choice()抽样方法的时间几乎不会随着抽样数量的变化而变化,而random.sample() 会随着抽样数量的增加而增加。
所以当数量较少的时候,random.sample() 用时非常少,而numpy.random.choice()则很长;
当抽样数量很大的时候,numpy.random.choice()几乎不变,而random.sample() 用时变长。
4.7 去除多维数组的轴,np.squeeze(a, axis=None)
注意只能去除长度为1的轴
示例
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
>>> np.squeeze(x, axis=0).shape
(3, 1)
>>> np.squeeze(x, axis=1).shape
Traceback (most recent call last):
...
ValueError: cannot select an axis to squeeze out which has size not equal to one
4.7 返回非0数组元组的索引,numpy.argwhere(condition)
- condition表示索引数组的条件
4.8 获取非0元素值,np.nonzero()
4.9 数组维数,ndarray.ndim
- 例子
>>> x = np.array([1, 2, 3])
>>> x.ndim
1
>>> y = np.zeros((2, 3, 4))
>>> y.ndim
3
4.10 按元素点乘 arr_a * arr_b
a = np.array([1, 1])
b = np.array([2, 2])
a * b
# Out[38]: array([2, 2])
4.11 获取数组大小
4.11.1 获取所有元素个数,size()
4.11.2 获取数组维度,shape()
4.11.3 获取第一个维度大小,len()
4.12 省略符…与冒号符:的对比
...
可以代表任意多维的元素,而每个:
只能代表一个维度。:
可以指定代表的维度的区间范围,...
不能。...
只能出现一次,而:
可以出现多次,但不能超过矩阵的维度。
4.13 对一整个维度执行函数,np.apply_along_axis(func, axis, arr)
5 数学运算
5.1 求倒数 1/x,np.reciprocal()
5. 2 爱因斯坦标记法
- 详见博客:一个函数打天下,einsum