numpy:是数据结构基础,主要处理python在数据和数值计算过程中处理速度慢的问题。

   功能:1、提供了一种新的数据结构, ndarray(数组)

          2、丰富的多维操作

             3、线性代数方面的运算

   官网:http://www.numpy.org/

   numpy的数据结构中只能有一种数据类型,通过(dtype=np.类型)定义数据类型。数据类型有bool, int, int8, int16, int32, int64, int128, uint8, uint16, uint32, uint64, uint128, float, float16, float32, float64, complex64/128.

  数据维度的Python表示:

数据维度 python表示 示例
一维数据 列表和集合类型 有序[3.1398, 3.1349, 3.1376]  无序{3.1398, 3.1349, 3.1376}
二维数据 列表类型

[[3.1398, 3.1349, 3.1376],

[3.1498, 3.1449, 3.1476]]

多维数据 列表类型

     一、属性 

  np.array()生成一个ndarray数组,ndarray在程序中的别名是:array

   np.array()输出成[]形式,元素由空格分隔。

1 import numpy as np
2 a = np.array([[0,1,2,3,4],[9,8,7,6,5]])
3 a
4 array([[0, 1, 2, 3, 4],
5        [9, 8, 7, 6, 5]])
6 print(a)
7 [[0 1 2 3 4]
8  [9 8 7 6 5]]

  轴(axis):保存数据的维度  秩(rank):轴的数量

  np.array是numpy中最基础的数据结构, 这个数据结构中的属性有:

属性 说明
shape 指明形状
ndim 维数
dtype 数据类型
itemsize np.array中每个元素的大小,以字节为单位
size numpy的大小

   输出list和array示例:

 1 #encoding = utf-8
 2 import numpy as np
 3 #encoding = utf-8
 4 import numpy as np
 5 list1 = [[[1,2,3,4],
 6           [4,5,6,7]],
 7          [[7,8,9,10],
 8           [10,11,12,13]],
 9          [[14,15,16,17],
10           [18,19,20,21]]]
11 list2 = np.array([[[1,2,3,4],
12                    [4,5,6,7]],
13                   [[7,8,9,10],
14                    [10,11,12,13]],
15                   [[14,15,16,17],
16                    [18,19,20,21]]
17                  ])
18 print("输出列表:")
19 print(list1)
20 print("输出数列:")
21 print(list2)
22 
23 运行结果:
24 输出列表:
25 [[[1, 2, 3, 4], [4, 5, 6, 7]], [[7, 8, 9, 10], [10, 11, 12, 13]], [[14, 15, 16, 17], [18, 19, 20, 21]]]
26 输出数列:
27 [[[ 1  2  3  4]
28   [ 4  5  6  7]]
29 
30  [[ 7  8  9 10]
31   [10 11 12 13]]
32 
33  [[14 15 16 17]
34   [18 19 20 21]]]

   shape、ndim、dtype、itemsize、size的操作示例:

 1 #encoding = utf-8
 2 import numpy as np
 3 
 4 def main():
 5     list1 = [[1,3,5],[2,4,6]]
 6     print(type(list1))
 7     np_list1 = np.array(list1)
 8     print(type(np_list1))
 9     np_list1 = np.array(list1, dtype = np.float)
10     print(np_list1.shape)
11     print(np_list1.ndim)
12     print(np_list1.dtype)
13     print(np_list1.itemsize)
14     print(np_list1.size)
15  
16 if __name__ == "__main__":
17     main()
18 
19 #输出结果
20 <class 'list'>
21 <class 'numpy.ndarray'>
22 (2, 3)
23 2
24 float64
25 8
26 6

   ndarray的元素类型:

数据类型 说明
bool 布尔类型,True或False
intc 与C语言中的int类型一致,一般是int32或int64
intp 用于索引的整数,与C语言中的ssize_t一致,int32或int64
int8 字节长度的整数,取值:[-128,127]
int16 16位长度的整数,取值:[-32768,32767]
int32 32位长度的整数,取值:[-231,231-1]
int64 64位长度的整数,取值:[-263,263-1]
 uint8  8位无符号整数,取值:[0,255]
 uint16  16位无符号整数,取值:[0,65535]
 uint32  32位无符号整数,取值:[0,232-1]
 uint64  64位无符号整数,取值:[0,264-1]
 float16  16位半精度浮点数:1位符号位,5位指数,10位尾数
 float32  32位半精度浮点数:1位符号位,8位指数,23位尾数
 float64  64位半精度浮点数:1位符号位,11位指数,52位尾数
complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数

   python语法仅支持整数、浮点数和复数3中类型,而ndarray支持表中那么多元素类型,原因是:

  1、科学计算涉及数据较多,对存储和性能都有较高要求。

  2、对元素类型精细定义,有助于Numpy合理使用存储空间并优化性能。

  3、对元素类型精细定义,有助于程序员对程序规模有合理评估。

   二、一些常用的数组

  ndarray数组的创建方法:

  (1)从python中的列表、元组等类型创建ndarray数组

    x = np.array(list/tuple)

    x = np.array(list/tuple,dtype=np.float32)

  当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型。

  (2)使用NumPy中函数创建ndarray数组,如:arange,ones,zeros等

数组 说明
zeros([m,n]) 数值初始化,生成m行n列的数组
ones([m,n]) 元素都置为1,生成m行n列的数组
full(shape,val) 根据shape生成一个数组,每个元素值都是val
random.rand(m,n) 生成0-1之间服从均匀分布的随机数
random.rand() 生成0-1之间的1个随机数
random.randint(1,10,3) 生成3个1-10之间的随机整数,生成整数括号内不能为空
random.randn(m,n) 生成服从标准正态分布的m行n列的随机数
random.choice([10,20,30]) 生成10,20,30之间的1个随机数
random.beta(m,n,M) 生成从m-n之间服从ß分布的M个随机数

   zeros、ones、random.rand、random.randint、random.randn、random.choice、random.betac操作示例:

 1 #encoding = utf-8
 2 import numpy as np
 3 
 4 def main():
 5     print("初始化:")
 6     print(np.zeros([2,4]))
 7     print(np.ones([3,5]))
 8    
 9     print("随机数:")
10     print(np.random.rand(2,4))
11     print(np.random.rand())
12     
13     print("随机整数:")
14     print(np.random.randint(1,10,3))
15    
16     print("正态分布的随机整数:")
17     print(np.random.randn(2,4))
18     
19     print("一维数组中选择生成随机数:")
20     print(np.random.choice([10,20,30]))
21     
22     print("服从beta分布的随机数:")
23     print(np.random.beta(1,10,5))
24 if __name__ == "__main__":
25     main()
26 
#运行结果 27 初始化: 28 [[ 0. 0. 0. 0.] 29 [ 0. 0. 0. 0.]] 30 [[ 1. 1. 1. 1. 1.] 31 [ 1. 1. 1. 1. 1.] 32 [ 1. 1. 1. 1. 1.]] 33 随机数: 34 [[ 0.32200808 0.12104838 0.70322247 0.56456672] 35 [ 0.95257224 0.87371518 0.29743618 0.13854885]] 36 0.37279692507129536 37 随机整数: 38 [7 6 5] 39 正态分布的随机整数: 40 [[ 0.9579207 -0.66080296 -0.12798636 0.20788484] 41 [ 0.19459448 1.06547597 -0.46216803 0.90047683]] 42 一维数组中选择生成随机数: 43 30 44 服从beta分布的随机数: 45 [0.16530894 0.12363116 0.09875519 0.03737488 0.203352]

   (3)使用NumPy中其他函数创建ndarray数组

函数 说明
np.linspace() 根据起始数据等间距地填充数据,形成数组
np.concatenate() 根据两个或多个数组合并成一个新的数组
1 import numpy as np
2 a = np.linspace(1,10,4)
3 print(a)
4 b = np.linspace(1,10,4,endpoint=False)
5 print(b)
6 
7 运行结果:
8 [  1.   4.   7.  10.]
9 [ 1.    3.25  5.5   7.75]

   ndarray数组的维度变换:

方法 说明
reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
resize(shape) 与reshape功能一致,但修改原数组
swapaxes(ax1,ax2) 将数组n个维度中的两个维度进行调换
flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
 #reshape操作
1
import numpy as np 2 a = np.ones((2,3,4),dtype=np.int32) 3 print(a) 4 a.reshape(3,8) 5 6 运行结果: 7 [[[1 1 1 1] 8 [1 1 1 1] 9 [1 1 1 1]] 10 11 [[1 1 1 1] 12 [1 1 1 1] 13 [1 1 1 1]]] 14 Out[20]: 15 array([[1, 1, 1, 1, 1, 1, 1, 1], 16 [1, 1, 1, 1, 1, 1, 1, 1], 17 [1, 1, 1, 1, 1, 1, 1, 1]])
 #swapaxes操作
1
import numpy as np 2 a = np.array([[1,2,3],[6,5,4]],dtype=np.int32) 3 print(a) 4 a.swapaxes(0,1) 5 6 运行结果: 7 [[1 2 3] 8 [6 5 4]] 9 Out[28]: 10 array([[1, 6], 11 [2, 5], 12 [3, 4]])

  ndarray数组的类型变换:

  new_a = a.astype(np.float)

  astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致。

  ndarray数组向列表的转换:

  a.tolist()    

  三、numpy中的操作

操作 说明 备注
arange(m,n) 生成m到n-1的等差数列 对numpy进行操作
exp(list) 对列表进行指数操作 对numpy进行操作
exp2(list) 自然指数的平方 对numpy进行操作
sqrt(list) 开方 对numpy进行操作
log(list) 底数是自然底数 对numpy进行操作
sum(axis=0)

数组是n维,axis可以到n-1。在python中list相加表示追加,

numpy中相加会作用到每个作用树上。axis越大深入程度越大。

对数组进行操作
max()    对数组进行操作
min()    对数组进行操作
list1+list2    
list1-list2    
list1*list2    
list**2    
np.dot(list1,list2)    对numpy进行操作
concatenate(list1, list2) numpy中的array进行追加 对numpy进行操作
vstack((list1,list2)) numpy中的array进行上下追加  对numpy进行操作
hstack((list1,list2))    对numpy进行操作
split(list,2) list分成2份  对numpy进行操作
copy(list) 对数组进行拷贝  对numpy进行操作

   对数组进行求arange、exp、exp2、sin、log操作:

 1 #encoding = utf-8
 2 import numpy as np
 3 #Array operation
 4 
 5 print("arithmetic progression:")
 6 print(np.arange(1,11).reshape([2,-1]))#-1表示缺省
 7 list1 = np.arange(1,11).reshape([2,-1])
 8 print("e^(list1):")
 9 print(np.exp(list1))
10 print("(list1)^2:")
11 print(np.exp2(list1))
12 print("sin")
13 print(np.sin(list1))
14 print("log")
15 print(np.log(list1))
16 
17 运行结果:
18 arithmetic progression:
19 [[ 1  2  3  4  5]
20  [ 6  7  8  9 10]]
21 e^(list1):
22 [[  2.71828183e+00   7.38905610e+00   2.00855369e+01   5.45981500e+01
23     1.48413159e+02]
24  [  4.03428793e+02   1.09663316e+03   2.98095799e+03   8.10308393e+03
25     2.20264658e+04]]
26 (list1)^2:
27 [[    2.     4.     8.    16.    32.]
28  [   64.   128.   256.   512.  1024.]]
29 sin
30 [[ 0.84147098  0.90929743  0.14112001 -0.7568025  -0.95892427]
31  [-0.2794155   0.6569866   0.98935825  0.41211849 -0.54402111]]
32 log
33 [[ 0.          0.69314718  1.09861229  1.38629436  1.60943791]
34  [ 1.79175947  1.94591015  2.07944154  2.19722458  2.30258509]]

     sum操作:

 1 #encoding = utf-8
 2 import numpy as np
 3 list2 = np.array([[[1,2,3,4],
 4                    [4,5,6,7]],
 5                   [[7,8,9,10],
 6                    [10,11,12,13]],
 7                   [[14,15,16,17],
 8                    [18,19,20,21]]
 9                  ])
10 print("所有元素相加:")
11 print(list2.sum())#这里不是对numpy进行操作,直接对list进行操作
12 print("第一层相加:")
13 print(list2.sum(axis = 0))
14 print("第二层相加:")
15 print(list2.sum(axis = 1))
16 print("第三层相加:")
17 print(list2.sum(axis = 2))
18 
19 运行结果:
20 所有元素相加:
21 252
22 第一层相加:
23 [[22 25 28 31]
24  [32 35 38 41]]
25 第二层相加:
26 [[ 5  7  9 11]
27  [17 19 21 23]
28  [32 34 36 38]]
29 第三层相加:
30 [[10 22]
31  [34 46]
32  [62 78]]

    数列相加:

 1 #encoding = utf-8
 2 import numpy as np
 3 list1 = np.array([10,20,30,40])
 4 list2 = np.array([4,3,2,1])
 5 print("Add:")
 6 print(list1+list2)
 7 
 8 运行结果:
 9 Add:
10 [14 23 32 41]

     数列点乘:

 1 #encoding = utf-8
 2 import numpy as np
 3 list1 = np.array([10,20,30,40])
 4 list2 = np.array([4,3,2,1])
 5 print("Dot:")
 6 print(np.dot(list1.reshape([2,2]), list2.reshape([2,2])))
 7 
 8 运行结果:
 9 Dot
10 [[ 80  50]
11  [200 130]]

   concatenate、vstack、hstack、split、copy操作:

 1 #encoding = utf-8
 2 import numpy as np
 3 list1 = np.array([10,20,30,40])
 4 list2 = np.array([4,3,2,1])
 5 print("Concatenate:")
 6 print(np.concatenate((list1,list2)))
 7 print("Vstack:")
 8 print(np.vstack((list1,list2)))
 9 print("Hstack:")
10 print(np.hstack((list1,list2)))
11 print("Split:")
12 print(np.split(list1,2))
13 print("Copy:")
14 print(np.copy(list1,2))
15 
16 运行结果:
17 Concatenate:
18 [10 20 30 40  4  3  2  1]
19 Vstack:
20 [[10 20 30 40]
21  [ 4  3  2  1]]
22 Hstack:
23 [10 20 30 40  4  3  2  1]
24 Split:
25 [array([10, 20]), array([30, 40])]
26 Copy:
27 [10 20 30 40]

   数组的索引和切片:

  索引:获取数组中特定位置元素的过程。

  切片:获取数组元素子集的过程。

  多维数组的索引与切片:

 

 1 import numpy as np
 2 a = np.arange(24).reshape(2,3,4)
 3 print(a)
 4 print("输出索引值1:")
 5 print(a[1,2,3])
 6 print("输出索引值2:")
 7 print(a[-1,-2,-3])
 8 print("输出切片1:")
 9 print(a[:,1,-3])#选取一个维度用:
10 print("输出切片2:")
11 print(a[:,1:3,:])#每个维度切片方法与一维数组相同
12 print("输出切片3:")
13 print(a[:,:,::2])#每个维度可以使用步长跳跃切片
14 
15 运行结果:
16 [[[ 0  1  2  3]
17   [ 4  5  6  7]
18   [ 8  9 10 11]]
19 
20  [[12 13 14 15]
21   [16 17 18 19]
22   [20 21 22 23]]]
23 #输出索引值1:
24 23
25 输出索引值2:
26 17
27 输出切片1:
28 [ 5 17]
29 输出切片2:
30 [[[ 4  5  6  7]
31   [ 8  9 10 11]]
32 
33  [[16 17 18 19]
34   [20 21 22 23]]]
35 输出切片3:
36 [[[ 0  2]
37   [ 4  6]
38   [ 8 10]]
39 
40  [[12 14]
41   [16 18]
42   [20 22]]]

 

 

 

 

 

 

 

 

 

  matplotlib:丰富的可视化套件,利用它可以做出折线图、柱状图等各种图表以及复杂的三维图。

  pandas:基础数据分析套件,交叉分析,时序分析,假设检验等等。

 

分类:

技术点:

相关文章: