python_numpy基础

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]

你可能感兴趣的:(python_numpy基础)