14.numpy的数组的创建
什么是numpy
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算(数组就是列表、列表嵌套列表等)
import numpy as np
t1 = np.array([1,2,3])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
t3 = np.arange(10)
print(t3)
print(t3.dtype)
[1 2 3]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
int64
import numpy as np
t1 = np.array(range(10),dtype="float64")
print(t1)
print(t1.dtype)
t2 = t1.astype("int8")
print(t2.dtype)
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
float64
int8
t3 = np.array([random.random() for i in range(10)])
print(t3)
print(t3.dtype)
t4 = np.round(t3,2)
print(t4)
[0.15551533 0.00401583 0.15190568 0.8632606 0.26929546 0.64721247
0.40041603 0.18216162 0.36326966 0.80083215]
float64
[0.16 0. 0.15 0.86 0.27 0.65 0.4 0.18 0.36 0.8 ]
15.数组的计算和数组的计算
数组的形状
import numpy as np
t1 = np.arange(12)
print(t1)
print(t1.shape)
t2 = np.array([[1,2,3],[5,4,6]])
print(t2.shape)
t3 = np.array([[[1,2,3],[5,4,6]],[[2,2,5],[5,7,3]]])
print(t3.shape)
t4 = np.arange(12)
print(t4.reshape((3,4)))
t5 = np.arange(24).reshape((2,3,4))
print(t5)
print(t5.flatten())
[ 0 1 2 3 4 5 6 7 8 9 10 11]
(12,)
(2, 3)
(2, 2, 3)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[[ 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]
数组和数的计算
广播原则
16.numpy读取本地数据
轴(axis)
在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴
numpy读取数据
CSV:Comma-Separated Value,逗号分隔值文件 显示:表格状态 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
unpack为转置,默认为False
numpy中的转置
17.numpy中的索引和切片
numpy中的索引和切片
import numpy as np
a = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
print(a[1])
#取第一行,第三行
print(a[[0,2]])
print(a[1:])
#取列
print(a[:,0])
print(a[:,[0,2]])
print(a[2,3])
print(type(a[2,3]))
#取多行多列,取第2行到第三行,第2列到第三列
#取的是行列的交叉点位置
b = a[1:3,1:3]
#取多个不相邻的点
c = a[[0,1],[0,3]]
print(c)
#取得点是 (0,0)(1,3)
[4 5 6 7]
[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[ 8 9 10 11]]
[0 4 8]
[[ 0 2]
[ 4 6]
[ 8 10]]
11
<class 'numpy.int64'>
[0 7]
18.numpy中更多的索引方式
numpy中数值的修改
np.where(t>10,20,0) 把t中大于10的替换成20,其他的替换为0
numpy中的clip(裁剪)
t里边小于10的换成10,大于18的换成18,nan是浮点类型
19.numpy中的nan和常用统计方法
numpy中的nan的注意点
nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
import numpy as np
t3 = np.arange(12).reshape((3,4))
print(t3)
print(np.sum(t3))
print(np.sum(t3,axis=0))
print(np.sum(t3,axis=1))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
66
[12 15 18 21]
[ 6 22 38]
那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
import numpy as np
t2=np.array([[0,3,3,3,3,3],
[0,3,3,3,10,11],
[0,13,14,15,16,17],
[0,19,20,11,20,20]])
print(t2.sum(axis=0))
print(t2.mean(axis=0))
print(t2.max(axis=0))
print(t2.min(axis=0))
print(np.median(t2,axis=0))
print(np.ptp(t2)) #极值,最大值和最小值之差
print(t2.std()) #标准差
[ 0 38 40 32 49 51]
[ 0. 9.5 10. 8. 12.25 12.75]
[ 0 19 20 15 20 20]
[0 3 3 3 3 3]
[ 0. 8. 8.5 7. 13. 14. ]
20
7.281540587906747
20.numpy中填充nan和youtube数据的练习
缺失值填充均值
import numpy as np
t1 = np.arange(12).reshape((3,4)).astype("float")
t1[1,2:] = np.nan
print(t1)
for i in range(t1.shape[1]):
temp_col = t1[:,i] #当前的一列
nan_num = np.count_nonzero(temp_col!=temp_col)
if nan_num !=0: #不为0,说明当前这一列中有nan
tem_not_nan_col = temp_col[temp_col==temp_col] #当前一列不为nan的array
temp_col[np.isnan(temp_col)] = tem_not_nan_col.mean()
print(t1)
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
21.数据的拼接
数据的拼接
↵
数组的行列交换
22.numpy中的随机方法
数据拼接例子
现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办?
import numpy as np
us_data = ""
uk_data = ""
#加载国家数据
us_data = np.loadtxt(us_data,delimiter=",",dtype = int)
uk_data = np.loadtxt(us_data,delimiter=",",dtype = int)
#添加国家信息
#构造全为0的数据
zeros_data = np.zeros(us_data.shape[0],1).astype(int)
ones_date = np.ones(ukss_data.shape[0],1).astype(int)
#分别添加一列全为0,1的数据
us_data = np.hstack((us_data,zeros_data))
uk_data = np.hstack((uk_data,ones_date))
numpy更多好用的方法
- 获取最大值最小值的位置 每一列最大值位置:np.argmax(t,axis=0) 每一行最大值的位置:np.argmin(t,axis=1)
- 创建一个全0的数组: np.zeros((3,4))
- 创建一个全1的数组:np.ones((3,4))
- 创建一个对角线为1的正方形数组(方阵):np.eye(3)