numpy学习笔记——读懂官方文档

1. 安装方法

pycharm-file-setting-project interpreter-选择‘+’-搜索numpy

 

2. 基本功能

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)   
# arange需要整理的数据集大小   reshape整理成几行几列

>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
# 输入a,直接整理成从0递增的三行五列数据

>>> a.shape  # a的格式 三行五列
(3, 5)

>>> a.ndim  # a的维数 2
2

>>> a.dtype.name  #dtype表示数组a内元素类型
'int64'

>>> a.itemsize   # 数组中每个元素占几位 8
8

>>> a.size  # a的大小 15
15

 

3. 构造数组

(1)使用array函数

# 生成一维数组
>>> a = np.array([2,3,4])  
>>> a
array([2, 3, 4])

# 生成二维数组,注意中括号和小括号
>>> b = np.array([(1.5,2,3), (4,5,6)])  
>>> b
array([[ 1.5,  2. ,  3. ],
       [ 4. ,  5. ,  6. ]])
 
# 生成复杂数组,类型提前声明,注意括号
>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])

(2)生成零数组zeros,一数组ones,空数组empty

>>> np.zeros( (3,4) )  
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

(3)arange生成数字序列

# 顺序递增序列
d = np.arange(15)
d
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

#开始10,结束30,步长5
#注意:不包括30
>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])

(4)linspace

# 0-2之间均匀找9个数,包括0和2
>>> np.linspace( 0, 2, 9 )                 
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])

(5)使用函数

>>> x = np.linspace( 0, 2*3.14, 10 )   
>>> x
array([ 1.        ,  1.58666667,  2.17333333,  2.76      ,  3.34666667,
        3.93333333,  4.52      ,  5.10666667,  5.69333333,  6.28      ])
>>>np.sin(x)
array([ 0.84147098,  0.99987407,  0.82390046,  0.37239904, -0.20363962,
       -0.71157736, -0.98155025, -0.92327428, -0.55623802, -0.0031853 ])

(6)随机数 random

>>> np.random.rand(3,2)
array([[ 0.14022471,  0.96360618],  
       [ 0.37601032,  0.25528411],  
       [ 0.49313049,  0.94909878]]) 

 

4. 数组的输出

# 三维数组的输出
>>> c = np.arange(24).reshape(2,3,4) 
# reshape的理解:第3个维度是4,里面有4个数据;
          第2个维度是3,里面有3个包含4个数据的数组
          第1个维度是2,里面有2个三行四列的矩阵
>>> print(c) [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]]

 

5. 主要操作

(1)点乘和叉乘

>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )

# 对应元素直接相乘
>>> A*B                         
array([[2, 0],
       [0, 4]])

# 矩阵乘法
>>> A.dot(B)                
array([[5, 4],
       [3, 4]])
>>> np.dot(A, B)     
array([[5, 4],
       [3, 4]])

(2)求最大max、最小min、求和sum,

在整个数组范围中求

>>> a = np.random.random((2,3))
>>> a
array([[ 0.18626021,  0.34556073,  0.39676747],
       [ 0.53881673,  0.41919451,  0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595

在某个维度求和

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

>>> b.sum(axis=0)       #  对列求和               
array([12, 15, 18, 21])

>>> b.min(axis=1)       # 对行求和               
array([0, 4, 8])

>>> b.cumsum(axis=1)     # 每行逐次求和             
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

 

6. 常用函数

aqrt、exp、sort...

 

7. 索引、切片、正则化

多维操作和一维操作相似

>>> def f(x,y):
...     return 10*x+y
...
>>> b = np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])

# 输出第2行,第3列的数
>>> b[2,3]
23
# 输出第0-5行(不包括第5行),第1列的数
>>> b[0:5, 1]                       
array([ 1, 11, 21, 31, 41])
# 输出所有行,第1列的数
# :表示所有
>>> b[ : ,1]                        
array([ 1, 11, 21, 31, 41])
# 输出1-3行(不包括第3行),所有数
>>> b[1:3, : ]                      
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])
# 输出最后一行
>>> b[-1]                                
array([40, 41, 42, 43])

...的用法

>>> c = np.array( [[[  0,  1,  2],    # c是三维数组
...                 [ 10, 12, 13]],
...                [[100,101,102],
...                 [110,112,113]]])
>>> c.shape
(2, 2, 3)

>>> c[1,...]    # 相当于 c[1,:,:] or c[1]
array([[100, 101, 102],
       [110, 112, 113]])
>>> c[...,2]   # 相当于 c[:,:,2]
array([[  2,  13],
       [102, 113]])

对行操作和对单个元素操作flat

# 对行进行操作
>>> for row in b:
...     print(row)
...
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]

# 对每个元素进行操作
>>> for element in b.flat:
...     print(element)
...
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43

 

8. 矩阵形状操作

shape

ravel

>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[ 2.,  8.,  0.,  6.],
       [ 4.,  5.,  1.,  1.],
       [ 8.,  9.,  3.,  6.]])
>>> a.shape
(3, 4)

>>> a.ravel()  # 拉成一维的了
array([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])

>>> a.reshape(6,2)  # 重新设定形状   若把2改为-1,则会自动计算
array([[ 2.,  8.],
       [ 0.,  6.],
       [ 4.,  5.],
       [ 1.,  1.],
       [ 8.,  9.],
       [ 3.,  6.]])

转置T

>>> a.T  
array([[ 2.,  4.,  8.],
       [ 8.,  5.,  9.],
       [ 0.,  1.,  3.],
       [ 6.,  1.,  6.]])

 

9.矩阵堆叠

多维操作时,hstack沿着第二维堆叠,vstack沿着第一维堆叠,

并且有可选参数来控制沿着哪个维度堆叠。

>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8.,  8.],
       [ 0.,  0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1.,  8.],
       [ 0.,  4.]])

# 竖着堆
>>> np.vstack((a,b))
array([[ 8.,  8.],
       [ 0.,  0.],
       [ 1.,  8.],
       [ 0.,  4.]])
#横着堆
>>> np.hstack((a,b))
array([[ 8.,  8.,  1.,  8.],
       [ 0.,  0.,  0.,  4.]])

函数 column_stack

直接使用

>>> np.r_[1:4,0,4]
array([1, 2, 3, 0, 4])

 

10. 分割数组

横向数着切hsplit、纵向数着切vsplit

>>> a = np.floor(10*np.random.random((2,12)))
>>> a
array([[ 9.,  5.,  6.,  3.,  6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],
          [ 1.,  4.,  9.,  2.,  2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])
 
>>> np.hsplit(a,3)     # 切成三个数组
[array([[ 9.,  5.,  6.,  3.], [ 1.,  4.,  9.,  2.]]),
 array([[ 6.,  8.,  0.,  7.], [ 2.,  1.,  0.,  6.]]),
 array([[ 9.,  7.,  2.,  7.], [ 2.,  2.,  4.,  0.]])]
>>> np.hsplit(a,(3,4))   # 第三列和第四列后面切一刀
[array([[ 9.,  5.,  6.], [ 1.,  4.,  9.]]),
 array([[ 3.], [ 2.]]),
 array([[ 6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.], [ 2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])]

 

11.拷贝

操作数组时,有时候拷贝了副本,有时候没有,如何区分这些情况。

(1)不拷贝

  简单的赋值

  函数调用

(2)浅拷贝

  view生成一个数据相同新数组

>>> c = a.view()  
>>> c is a     # c和a是同一个数组
False  
>>> c.base is a      #c是a持有数据的镜像  
True  
>>> c.flags.owndata  
False  


>>> c.shape = 2,6    # 改变c的形状,a的形状没变  
>>> a.shape  
(3, 4) 
>>> c[0,4] = 1234        #改变c的数据,a的数据改变
>>> a  
array([[   0,    1,    2,    3],  
       [1234,    5,    6,    7],  
       [   8,    9,   10,   11]]) 

  数据切片后返回浅拷贝,原始数据不受损

(3)深拷贝

  copy完全拷贝数组和数据

>>> d = a.copy()                   
>>> d is a
False
>>> d.base is a         # d和a没有关系              
False

 

12. 索引

>>> a = np.arange(12)**2                      
>>> i = np.array( [ 1,1,3,8,5 ] )            
>>> a[i]            # 输出的是数组a中第i个位置中的数                
array([ 1,  1,  9, 64, 25])

若a是多维的,则索引指向它的第一维

索引可以是多维的,索引的每一维必须形状相同

利用索引来选择数组

>>> a = np.arange(12).reshape(3,4)
>>> b1 = np.array([False,True,True])            
>>> b2 = np.array([True,False,True,False])     

# 选择行
>>> a[b1,:]                                  
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a[b1]                                     
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
# 选择列
>>> a[:,b2]                                 
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])
# 选择行列
>>> a[b1,b2]                               
array([ 4, 10])

ix_()函数 为了方便计算使用

可以为了获得多元组的结果而用来结合不同向量。例如,如果你想要用所有向量a、b和c元素组成的三元组来计算a+b*c

>>> a = np.array([2,3,4,5])
>>> b = np.array([8,5,4])
>>> c = np.array([5,4,6,8,3])
>>> ax,bx,cx = np.ix_(a,b,c)
>>> ax
array([[[2]],
       [[3]],
       [[4]],
       [[5]]])
>>> bx
array([[[8],
        [5],
        [4]]])
>>> cx
array([[[5, 4, 6, 8, 3]]])
>>> ax.shape, bx.shape, cx.shape
((4, 1, 1), (1, 3, 1), (1, 1, 5))

>>> result = ax+bx*cx
>>> result
array([[[42, 34, 50, 66, 26],
        [27, 22, 32, 42, 17],
        [22, 18, 26, 34, 14]],
       [[43, 35, 51, 67, 27],
        [28, 23, 33, 43, 18],
        [23, 19, 27, 35, 15]],
       [[44, 36, 52, 68, 28],
        [29, 24, 34, 44, 19],
        [24, 20, 28, 36, 16]],
       [[45, 37, 53, 69, 29],
        [30, 25, 35, 45, 20],
        [25, 21, 29, 37, 17]]])
>>> result[3,2,4]
17
>>> a[3]+b[2]*c[4]
17

 

13. 线性代数

>>> import numpy as np
>>> a = np.array([[1.0, 2.0], [3.0, 4.0]])
>>> print(a)
[[ 1.  2.]
 [ 3.  4.]]

>>> a.transpose()  # 转置
array([[ 1.,  3.],
       [ 2.,  4.]])

>>> np.linalg.inv(a)  # 取反
array([[-2. ,  1. ],
       [ 1.5, -0.5]])

>>> u = np.eye(2) # 单位阵
>>> u
array([[ 1.,  0.],
       [ 0.,  1.]])

>>> j = np.array([[0.0, -1.0], [1.0, 0.0]])
>>> np.dot (j, j)   # 矩阵间相乘
array([[-1.,  0.],
       [ 0., -1.]])

>>> y = np.array([[5.], [7.]])
>>> np.linalg.solve(a, y)   # 解方程
array([[-3.],
       [ 4.]])

 

14. 直方图 

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> mu, sigma = 2, 0.5
>>> v = np.random.normal(mu,sigma,10000)
>>> plt.hist(v, bins=50, normed=1)      
>>> plt.show()

 

 

posted @ 2017-11-26 13:33  farmerspring  阅读(873)  评论(0编辑  收藏  举报