Numpy数据分析基础

Numpy模块学习

numpy的基本属性

1
2
3
4
5
6
7
8
9
10
import numpy as np

array = np.array([[1,2,3],
[2,3,4]])
print(array) # [[1 2 3]
# [2 3 4]]

print('number of dim:',array.ndim) #维数 number of dim: 2
print('shape:',array.shape) #shape: (2, 3)
print('size:',array.size) #size: 6

numpy创建的array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np

a = np.array([2,23,4],dtype=np.int) #定义数据的类型
print(a) #[ 2 23 4]
print(a.dtype) #int32

a = np.zeros((4,2)) #生成一个4行2列的全0矩阵
print(a)

a = np.ones((4,2)) #生成一个4行2列的全1矩阵
print(a)
#[[1. 1.]
# [1. 1.]
# [1. 1.]
# [1. 1.]]

#我们可以对它的数据类型进行规定
a = np.ones((4,2),dtype=int)
print(a)
#[[1 1]
# [1 1]
# [1 1]
# [1 1]]

a = np.empty((3,4)) #空矩阵 矩阵中的数十分接近零
print(a)

a = np.arange(10) #0-9
a = np.arange(10,20,2) #有序从10到20 步长为2
print(a) #[10 12 14 16 18]

a = np.arange(12).reshape((3,4)) #首先构造一个0-11的序列 然后reshape使他变为3*4的矩阵
print(a)
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]

a = np.linspace(10,20,20) #构造10-20 有20个数在里面
print(a)

a = a.reshape((4,5)) #把上述的linspace reshape为4*5的矩阵
print(a)
#[[10. 10.52631579 11.05263158 11.57894737 12.10526316]
# [12.63157895 13.15789474 13.68421053 14.21052632 14.73684211]
# [15.26315789 15.78947368 16.31578947 16.84210526 17.36842105]
# [17.89473684 18.42105263 18.94736842 19.47368421 20. ]]

numpy的基础运算1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np

a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b) #[10 20 30 40] [0 1 2 3]
c = a + b
print(c) #[10 21 32 43]

c = c**2
print(c) #[ 100 441 1024 1849]

c = 10*np.sin(a) #把a都放到sin函数种
print(c) #[-5.44021111 9.12945251 -9.88031624 7.4511316 ]

print(a>10) # a种大于10的有哪些? [False True True True]
print(a==10) #a=10有哪些? [ True False False False]

a = np.array([[2,1],
[0,3]])
c=a*a #对应位置乘
c_dot=np.dot(a,a) #矩阵乘法
c_dot_2=a.dot(a) #矩阵乘法 a*a
print(c)
#[[4 1]
# [0 9]]
print(c_dot)
#[[4 5]
# [0 9]]

a = np.random.random((2,4)) #2行4列 0-1随机数
print(a)
#[[0.93790893 0.46084244 0.1663417 0.21452909]
# [0.45389007 0.3981491 0.06045777 0.41783302]]

a = np.array([[1,2,3,4,5],
[9,10,11,12,13]])
print(np.sum(a)) #70
print(np.sum(a,axis=1)) #每一行的和 #[15 55]
print(np.sum(a,axis=0)) #每一列的和 #[10 12 14 16 18]
print(np.min(a)) #1
print(np.max(a)) #13
print(np.min(a,axis=1)) #每一行最小值 [1 9]

numpy基础运算2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np

a = np.arange(2,14).reshape(3,4)
print(a)
#[[ 2 3 4 5]
# [ 6 7 8 9]
# [10 11 12 13]]
print(np.argmin(a)) # .argmin()索引最小的数的index #0
print(np.argmax(a)) # .argmax()索引最大的数的index #11
print(np.mean(a)) #把矩阵中的数据的平均值7.5
print(np.mean(a,axis=0)) #列平均
print(np.mean(a,axis=1)) #行平均
print(np.median(a)) #中位数 7.5
print(np.cumsum(a)) #每个数据的前缀和[ 2 5 9 14 20 27 35 44 54 65 77 90] 如果想要矩阵形式,只需要reshape一下
print(np.diff(a)) #每个数据与前面一个数据的差
#[[1 1 1]
# [1 1 1]
# [1 1 1]]
print(np.nonzero(a))
#会输出非零元素的行列
#(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))

print(np.sort(a)) #这里的sort不对所有元素排序 而是逐行排序
print(np.transpose(a)) #矩阵的转置
#[[ 2 6 10]
# [ 3 7 11]
# [ 4 8 12]
# [ 5 9 13]]
print(a.T) #矩阵的转置

print(np.clip(a,5,9)) #.clip(a,min,max)大于9的变为9,小于5的变为5,使数据在5-9之间

numpy的索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np

a = np.arange(3,15).reshape(3,4)

print(a)
#[[ 3 4 5 6]
# [ 7 8 9 10]
# [11 12 13 14]]
print(a[2]) #[11 12 13 14]
print(a[2][0]) #11
print(a[2,0]) #同上,11
print(a[1,1:]) #第1行,从第1列开始到最后 [ 8 9 10]
print(a[1,1:3]) #第1行,从第1列开始到第2列(左闭右开) [8 9]

for row in a:
print(row)
#[3 4 5 6]
#[7 8 9 10]
#[11 12 13 14]
for column in a.T:
print(column)
#[ 3 7 11]
#[ 4 8 12]
#[ 5 9 13]
#[ 6 10 14]

print(a.flatten()) # 将矩阵变成一行列表 [ 3 4 5 6 7 8 9 10 11 12 13 14]
for item in a.flat: # a.flat是迭代器
print(item)
#也可以这样
for item in a.flatten(): # 这里a.flatten()不是迭代器,只是一个简单的列表
print(item)

numpy的array合并

1
2
3
4
5
6
7
8
import numpy as np

a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b)) #vertical stack ,可以是3或者多个个合并,上下合并
print(c)
#[[1 1 1]
# [2 2 2]]
1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

a = np.array([[1, 1, 1]])
b = np.array([[2, 2, 2]])
c = np.array([[3, 3, 3]])

d = np.concatenate((a,b,c),axis=0) #纵向合并
print(d)
#[[1 1 1]
# [2 2 2]
# [3 3 3]]
d = np.concatenate((a,b,c),axis=1) #横向合并
print(d) #[[1 1 1 2 2 2 3 3 3]]

下面单独拿出来说一下关于array的维度的问题和newaxis这个函数的理解

比如:

1
2
print(np.transpose(a))  #[1 1 1] 
print(a.T) #同上[1 1 1]

一个二维的数组才有转置,一个一维的数组把他转置后,再放回一维数组那还是原来的一维数组,如果我们想让它输出一列那样,那就是一个二维的数组了,所以此时我们就需要增加维数。

这里引入一个函数$numpy.axis$ 可以用来增加数组的维数

1
2
3
4
5
#我们给列增加维数 相当于 a[3]->a[3][1]
print(a[:,np.newaxis]) #列增加一个维度
#[[1]
# [1]
# [1]]
1
2
#给行增加维数 相当于  a[3]->a[1][3] 
print(a[np.newaxis, :]) #[[1 1 1]]

array的分割

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np

a = np.arange(12).reshape((3,4))
print(a)
#[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(np.split(a,4,axis=1)) #等量分割 spilt(分割的数组,分成相等的几分[不能分成不相等的份数],横向还是纵向1是纵向,0是横向)
#[array([[0],
# [4],
# [8]]), array([[1],
# [5],
# [9]]), array([[ 2],
# [ 6],
# [10]]), array([[ 3],
# [ 7],
# [11]])]

print(np.array_split(a,3,axis=1)) #不等量分割
#[array([[0, 1],
# [4, 5],
# [8, 9]]), array([[ 2],
# [ 6],
# [10]]), array([[ 3],
# [ 7],
# [11]])]
print('111')
print(np.vsplit(a, 3)) #纵向等量分割

print(np.hsplit(a, 2)) #横向等量分割

numpy的copy&deepcopy

1
b=a.copy()  #deep copy