Bootstrap

数据分析-Day03 Python-numpy

目录

1. numpy创建数组

2. numpy 数组的形状

3. 数组的计算

3.1 数组与数字的计算

3.2 数组和数组的计算

3.3 轴

4. numpy读取数据

4.1 读取 csv 文件

4.2 numpy中的转置

5. 数组的索引和切片

6. numpy中数值的修改

7. numpy中的 nan

8. numpy 中常用统计函数

9. 数组的拼接

10. 数组的行列交换


1. numpy创建数组

#测试numpy中的数组

import numpy as np    #导入 numpy
import random

a = np.array([1,2,3,4,5])
b = np.array(range(1,5))
c = np.arange(1,6,dtype=float)
print(a)
print(b)
print(c)
c = c.astype(int)

d = np.array([random.random() for i in range(10)])
print(d)

print(np.round(d,2))     #保留两位小数


'''
输出结果:
[1 2 3 4 5]
[1 2 3 4]
[1. 2. 3. 4. 5.]
[0.83478331 0.57183625 0.64594309 0.77648844 0.94178162 0.41432769
 0.12386185 0.87640671 0.69635833 0.78718436]
[0.83 0.57 0.65 0.78 0.94 0.41 0.12 0.88 0.7  0.79]
'''

2. numpy 数组的形状

1)a.shape 返回一个元组。

2)reshape():是一个有返回值的操作,不会对源数据进行修改。参数原则上是一个元组,但只输入行、列数值也可行。

#测试数组的形状

import numpy as np

a = np.arange(24).reshape((2,3,4))
print(a.shape)

a1 = a.reshape(1,24)   #不是一维数组
print(a1)


#将多维数组转化为一维数组
num = 1
for i in range(len(a.shape)):
    num *= a.shape[i]
a2 = a.reshape(num,)
print(a2)

a3 = a.flatten()
print(a3)


'''
输出结果:
(2, 3, 4)
[[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
'''

3. 数组的计算

3.1 数组与数字的计算

【广播机制】在运算过程中,与数字的加减乘除被广播到数组所有元素上面。例如:

3.2 数组和数组的计算

#测试数组的计算

import numpy as np

a = np.arange(24).reshape((4,6))      #4行6列的数组
b = np.arange(100,124).reshape(4,6)   #4行6列的数组
c = np.arange(6)                      #1行6列的数组
d = np.arange(4).reshape(4,1)         #4行1列的数组

print(a+b)   #两数组形状一致,对应位置的元素进行加减计算
print(a-c)   #a数组每行元素与c数组对应位置的元素可加减
print(a-d)   #a数组每列元素与d数组对应位置的元素可加减



'''
输出结果:
[[100 102 104 106 108 110]
 [112 114 116 118 120 122]
 [124 126 128 130 132 134]
 [136 138 140 142 144 146]]
[[ 0  0  0  0  0  0]
 [ 6  6  6  6  6  6]
 [12 12 12 12 12 12]
 [18 18 18 18 18 18]]
[[ 0  1  2  3  4  5]
 [ 5  6  7  8  9 10]
 [10 11 12 13 14 15]
 [15 16 17 18 19 20]]
'''

3.3 轴

numpy中可以理解为方向使用0,1,2...数字表示对于一个一维数组只有一个0对于2维数组(shape(2,2)),0轴和1对于三维数组(shape(2,2, 3)),0,1,2轴。

4. numpy读取数据

4.1 读取 csv 文件

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False

#测试numpy读取数据

import numpy as np

us_file_path = "./us_video_data_numbers.csv"
gb_file_path = "./gb_video_data_numbers.csv"

#unpack:转置
t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)

4.2 numpy中的转置

#测试numpy转置操作

import numpy as np

t = np.arange(24).reshape((4,6))

t1 = t.transpose()
t2 = t.T
t3 = t.swapaxes(1,0)     #交换轴

5. 数组的索引和切片

#测试numpy 的切片和索引

import numpy as np

#取单独的某行
print(t1[2])

#取连续的多行
print(t1[1:4])   #第2行至第4行
print(t1[2:])    #从第3行开始的每一行

#取不连续的多行
print(t1[[2,7,10]])     #第3、8、11行

#逗号前表示行,逗号后表示列;冒号表示全部都要
print(t1[1,:])            #第2行
print(t1[1:,:])           #从第2行开始的每一行
print(t1[[2,10,3],:])     #第3、11、4行

#取某列
print(t1[:,0])           #第1列

#取连续的多列
print(t1[:,1:])         #从第2列开始的每列

#取不连续的多列
print(t1[:,[0,2]])      #第1列和第3列


#取某行某列
a = t1[2,3]       #第3行、第4列
print(type(a))    #<class 'numpy.int32'>

#取多行多列
b = t1[2:5,1:4]      #第3-5行、2-4列
print(b)

#取多个不相邻的点
c = t1[[0,2,2],[0,1,3]]    #坐标[0,0]、[2,1]、[2,3]的点

6. numpy中数值的修改

#测试numpy中数值的修改

import numpy as np

t = np.arange(24).reshape((4,6))
print(t)
print("*"*100)

t[:,2:4] = 0       #第3、4列元素全部替换为0

print(t<10)        #布尔索引
t[t<10] = 3        #将t中小于10的数字替换为3

#numpy的三元运算符
t1 = np.where(t<10,0,10)    #将t中小于10的数字替换为0,大于等于10的替换为10
print(t1)

t2 = t.clip(10,20)    #将t中小于10的数字替换为10,大于20的替换为20
print(t2)

7. numpy中的 nan

1)nan(NAN,Nan):not a number表示不是一个数字

2)nan 的 type类型为 float

#测试numpy中的nan

import numpy as np

print(np.nan == np.nan)      #结果为 False

t = np.arange(24,dtype=float).reshape((4,6))
t[2,4:] = np.nan
print(t)

print("*"*100)

print(t!=t)
print(np.isnan(t))
print(np.count_nonzero(t!=t))
print(np.count_nonzero(np.isnan(t)))

print("*"*100)

t[np.isnan(t)] = 0

#np.sum()
t1 = np.arange(12).reshape((3,4))
a = np.sum(t1)
b = np.sum(t1,axis=0)     #每行对应位置相加
c = np.sum(t1,axis=1)     #每列对应位置相加

print("*"*100)

#nan和任何值计算都为nan
print(np.sum(t,axis=0))


'''
输出结果:
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. nan nan]
 [18. 19. 20. 21. 22. 23.]]
****************************************************************************************************
[[False False False False False False]
 [False False False False False False]
 [False False False False  True  True]
 [False False False False False False]]
[[False False False False False False]
 [False False False False False False]
 [False False False False  True  True]
 [False False False False False False]]
2
2
****************************************************************************************************
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15.  0.  0.]
 [18. 19. 20. 21. 22. 23.]]
****************************************************************************************************
[36. 40. 44. 48. 36. 39.]
'''

8. numpy 中常用统计函数

求和:t.sum(axis=None)

均值:t.mean(a,axis=None)  

中值:np.median(t,axis=None)

最大值:t.max(axis=None)

最小值:t.min(axis=None)

极值:np.ptp(t,axis=None) ,即最大值和最小值之差

标准差:t.std(axis=None)

#用均值填充nan

import numpy as np

def fill_ndarray(t):
    for i in range(t.shape[1]):  #遍历每一列
        col = t[:,i]             #当前的一列
        nan_num = np.count_nonzero(col!=col)
        if nan_num != 0:          #当前列中有nan
            not_nan_col = col[col==col]   #当前一列不为nan的数组
            col[np.isnan(col)] = not_nan_col.mean()  #选中当前为nan的位置,替换为非nan数值的均值
    return t

if __name__ == '__main__':
    t = np.arange(24,dtype=float).reshape((4,6))
    t[2,4:] = np.nan
    print(t)
    t = fill_ndarray(t)
    print(t)


'''
输出结果:
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. nan nan]
 [18. 19. 20. 21. 22. 23.]]
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. 12. 13.]
 [18. 19. 20. 21. 22. 23.]]
'''

9. 数组的拼接

#数组的拼接

import numpy as np

t1 = np.arange(12).reshape((2,6))
t2 = np.arange(12,24).reshape((2,6))

#竖直拼接
t3 = np.vstack((t1,t2))
print(t3)

#水平拼接
t4 = np.hstack((t1,t2))
print(t4)


'''
输出结果:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 0  1  2  3  4  5 12 13 14 15 16 17]
 [ 6  7  8  9 10 11 18 19 20 21 22 23]]
'''

10. 数组的行列交换

#数组的行列交换

import numpy as np

t = np.arange(12,24).reshape(3,4)
print(t)

print("*"*100)

#第2、3行交换
t[[1,2],:] = t[[2,1],:]
print(t)

print("*"*100)

#第1、3列交换
t[:,[0,2]] = t[:,[2,0]]
print(t)


'''
输出结果:
[[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]
****************************************************************************************************
[[12 13 14 15]
 [20 21 22 23]
 [16 17 18 19]]
****************************************************************************************************
[[14 13 12 15]
 [22 21 20 23]
 [18 17 16 19]]
'''

;