1. 矩阵的创建
In:
a=np.arange(1,5)
a=np.array([1,2,3,4,5])
print a, a.dtype, a.shape, a.size, a.ndim
Out:
[1 2 3 4]
np.arange类似range函数
np.array用来生成矩阵
dtype是数据类型,有int64, complex, uint16等
shape是个元组属性,表示每一维的宽度
size是所有元素个数
ndim是维数
linspace创建
In:
# linspace返回0,1之间的5个数据
x=np.linspace(0,1,5)
Out:
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
2.铺平一个矩阵
In:
b=np.array([1,2,3],dtype='float16') # int64, complex, uint16......
#注意[]的使用
m=np.array([np.arange(6),np.arange(6)])
n=np.array([[1,2,3,4],[5,6,7,8]])
#展平一个矩阵
x=m.ravel()#x为[0 1 2 3 4 5 0 1 2 3 4 5]
y=n.flatten()#y为[1 2 3 4 5 6 7 8]
注解:
ravel()和flatten()看起来效果一样,都是把矩阵展平了。它们的区别在于
ravel()返回的是原有数据的一个映射(view),没有分配新的存储,改变它的值原有数据会变
flatten()返回的是新的数据,改变它的值原有数据不会变
3.改变矩阵的shape/size(直接在当前数据上修改,返回空)
In:
#
n=[[0 1 2 3 4 5]
[0 1 2 3 4 5]]
# reshape返回一个view
x=n.reshape(3,4)
#
x=[[0 1 2 3]
[4 5 0 1]
[2 3 4 5]]
n不变
# resize直接在当前数据上更改,返回空
y=n.resize(3,4)
#y为none,
n=[[0 1 2 3]
[4 5 0 1]
[2 3 4 5]]
注:
当改变一个x的值时,比如x[2]=10,n的值会随之改变。
如果想要它不变, copy()可以强制返回一个新的数据
x=m.reshape(3,4).copy()
4.随机排一维
In:
a = np.arange(10)#a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
np.random.shuffle(a) # 随机排第一维
Out
a=[2 3 6 7 0 4 9 5 1 8]
In
a = np.arange(9).reshape((3, 3))
np.random.shuffle(a)
Out
[[6, 7, 8],
[0, 1, 2],
[3, 4, 5]]
5.生成全1、全0、对角矩阵
# 全0矩阵
a=np.zeros((3,3))
# 全1矩阵
b=np.ones((5,4))
# 单位矩阵
c=np.eye(3)
# 取对角元素
np.diag(b)
6.矩阵的加法
a = np.arange(9).reshape((3, 3))
## 每个元素的broadcast
print a
print a+3
## 行broadcast
print a+np.arange(3)
## 列broadcast
print a+np.arange(3).reshape(3,1)
注:
nm + 11 就是将11的元素作用在nm的整个矩阵
nm + n1 就是将n1的元素作用在nm的每一列
nm + 1m 就是将1m的元素作用在nm的每一行
(乘法类似)
7.矩阵的转置
print m.transpose()
print m.T
8.矩阵的乘法
a = np.arange(4).reshape((2, 2))#a=[[0, 1],[2, 3]]
b = np.linspace(1,2,2)#b=[1,2]
# 两种矩阵乘法形式
print a.dot(b)
print np.dot(a,b)
#输出[2,8]
## 每个元素broadcast
print a*2
# 行broadcast
print a*[1,2]
#a为[[0, 1],[2, 3]],输出[[0, 2], [2, 6]]
# 列broadcast
a*[[1],[2]]
#a为[[0, 1],[2, 3]],输出[[0, 1], [4, 6]])
9.矩阵的拼接
hstack
##a为[[0, 1],[2, 3]],b=[[0, 2], [4, 6]]
c=np.hstack((a,b))#horizontal
#c=[[0, 1, 0, 2], [2, 3, 4, 6]]
c=np.vstack((a, b))#vertical
#c=[[0, 1], [2, 3], [0, 2], [4, 6]]
concatenate
d=np.concatenate((a, b), axis=1)
#d=[[0, 1, 0, 2],[2, 3, 4, 6]]
d=np.concatenate((a, b), axis=0)
#d=[[0, 1], [2, 3], [0, 2], [4, 6]]
#a为[[0, 1],[2, 3]]
print np.hsplit(a, 2)#[array([[0],[2]]), array([[1], [3]])]
print np.vsplit(a,2)#[array([[0, 1]]), array([[2, 3]])]
10.矩阵的查找
In:
a = np.arange(12).reshape((3, 4))
b = a%2==0#布尔类型
c = a>4#布尔类型
print b
print c
Out:
a=[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
b=([[ True, False, True, False],
[ True, False, True, False],
[ True, False, True, False]], dtype=bool)
c=([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]], dtype=bool)
#a=[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]
print np.argmax(a)#11
# 其实是列broadcast,返回每列最大值的index
print np.argmax(a, axis=0)
#array([2, 2, 2, 2]),共4列,每列第三个元素最大
# 行broadcast,返回每行最大值的index
print np.argmax(a, axis=1)
#array([3, 3, 3]),共3行,每行第4个元素最大
# np.where支持多个逻辑组合, 得到满足条件的index
idx=np.where((a>3))
print a[idx]
idx=np.where((a>3)&(a<7))
#idx=(array([1, 1, 1, 1, 2, 2, 2, 2]), array([0, 1, 2, 3, 0, 1, 2, 3]))
#第一个array是行,第二个array是列
print a[idx]
#[ 4 5 6 7 8 9 10 11]
idx=np.where((a>3)&(a<7))
print a[idx]