numpy
文章目录
什么是numpy?
- 一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
numpy创建数组(矩阵)
创建数组
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
# a, b, c内容相同
arange与range的区别
-
range:(只能创建int型list)
range(start, end, step) # 返回一个list对象也就是range.object
-
arange:(与range类似,可以使用float型数据)
arange(start, end, step) # 但是返回一个array对象
数组的类名
type(a)
<class 'numpy.ndarray'>
数据的类型
a.dtype
dtype('int32')
数据类型的操作
# 指定创建的数组的数据类型
a = np.array([1,0,1,0], dtype=np.bool)
a
array([ True, False, True, False])
# 修改数组的数据类型
a.astype(np.int8)
array([1, 0, 1, 0], dtype=int8)
# 修改浮点型的小数位数
d
array([1.456456, 2.44893 , 3.218 , 4.4894 , 5.4561 ])
np.round(d,2)
array([1.46, 2.45, 3.22, 4.49, 5.46])
举例:
# coding=utf-8
import random
import numpy as np
t1 = np.array([1,2,3,4])
print(t1)
print(type(t1))
t2 = np.array(range(10))
print(t2)
t3 = np.arange(4,10,2)
print(t3)
print(type(t3))
print(t3.dtype)
print("*"*100)
# numpy中的数据类型
t4 = np.array(range(1,4),dtype="i1")
print(t4)
print(t4.dtype)
# numpy中的bool类型
t5 = np.array([1,1,0,1,0,0],dtype=bool)
print(t5)
print(t5.dtype)
# astype 调整数据类型
t6 = t5.astype("int8")
print(t6)
print(t6.dtype)
# numpy中的小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
t8 = np.round(t7,2)
print(t8)
输出结果为
[1 2 3 4]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
[4 6 8]
<class 'numpy.ndarray'>
int32
****************************************************************************************************
[1 2 3]
int8
[ True True False True False False]
bool
[1 1 0 1 0 0]
int8
[0.56633182 0.20426739 0.28094801 0.02718695 0.04238068 0.36150382
0.23685325 0.8804967 0.22810048 0.42815056]
float64
[0.57 0.2 0.28 0.03 0.04 0.36 0.24 0.88 0.23 0.43]
数组的形状
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,90]])
a.shape # 查看数组的形状
a.reshape(3,4) # 修改数组形状 (返回修改后的矩阵,但a的形状不会改变)
数组与数的计算
数组a与数字b的计算是b与a中每一位进行计算,这是由numpy的广播机制造成的,在运算过程中,加减乘除的值被广播到所有的元素上面。
数组与数组计算
数组与数组间的计算遵循广播原则(如果两个数组的后援维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1 的维度上进行)
nump读取数据
参数 | 解释 |
---|---|
frame | 文字、字符串或产生器 |
dtype | 数据类型、默认 np.float 默认科学计数法 |
delimiter | 分割字符串、默认是空格 |
skiprows | 跳过前x行 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果为 True,读入属性将分别写入不同数组变量,相当于转置的效果,如果为 false,读入数据只写入一个数据变量,默认False |
# coding=utf-8
import numpy as np
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
# delimiter按照","进行分割
# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
# print(t1)
print(t2)
numpy索引和切片
对于刚刚加载出来的数据,我如果只想选择其中的某一列(行)我们应该怎么做呢?
a[1] # 取一行
a[:,2] # 取一列
a[1:3] # 取多行
a[:,2:4] # 取多列
numpy中数值的修改
b
array([1, 2, 3, 4, 5])
b[2] = 0 # 将第三列的值变为0
b
array([1, 2, 0, 4, 5])
numpy中的布尔索引
t = np.arange(24).reshape((4,6))
t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
t[t < 10] = 0
t
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
t > 10
array([[False, False, False, False, False, False],
[False, False, False, False, False, True],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True]])
numpy中的三元运算符
t = np.arange(24).reshape((4,6))
t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
np.where(t<10,0,20)
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 20, 20],
[20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20]])
t # 并没有修改t中的值
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
numpy中的clip(裁剪)
t
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
t.clip(10,18)
array([[10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 18, 18, 18, 18, 18]])
numpy中的nan和inf
-
nan(NAN,Nan):not a number表示不是一个数字
-
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
-
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
-
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
那么如何指定一个nan或者inf呢?注意他们的type类型
a = np.inf
type(a)
<class 'float'>
a = np.nan
type(a)
<class 'float'>
numpy中nan的注意点
-
两个nan是不相等的
-
np.nan != np.nan 为 true
-
利用以上的特殊性,判断数组中nan的个数
-
由于2,如何判断一个数字是否为nan呢?
通过np.isnan(a)来判断,返回bool类型,比如希望把nan替换为0
-
nan和任何值计算都为nan
-
替换nan时,一般把缺失的数值替换为均值(中值)
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)
练习:
# coding=utf-8
import numpy as np
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
# t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
# print(t1)
print(t2)
print("*"*100)
#取行
# print(t2[2])
#取连续的多行
# print(t2[2:])
#取不连续的多行
# print(t2[[2,8,10]])
# print(t2[1,:])
# print(t2[2:,:])
# print(t2[[2,10,3],:])
#取列
# print(t2[:,0])
#取连续的多列
# print(t2[:,2:])
#取不连续的多列
# print(t2[:,[0,2]])
#去行和列,取第3行,第四列的值
# a = t2[2,3]
# print(a)
# print(type(a))
#取多行和多列,取第3行到第五行,第2列到第4列的结果
#去的是行和列交叉点的位置
b = t2[2:5,1:4]
# print(b)
#取多个不相邻的点
#选出来的结果是(0,0) (2,1) (2,3)
c = t2[[0,2,2],[0,1,3]]
print(c)
-
希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
# coding=utf-8 import numpy as np us_data = "./youtube_video_data/US_video_data_numbers.csv" uk_data = "./youtube_video_data/GB_video_data_numbers.csv" #加载国家数据 us_data = np.loadtxt(us_data,delimiter=",",dtype=int) uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int) # 添加国家信息 #构造全为0的数据 zeros_data = np.zeros((us_data.shape[0],1)).astype(int) ones_data = np.ones((uk_data.shape[0],1)).astype(int) #分别添加一列全为0,1的数组 us_data = np.hstack((us_data,zeros_data)) uk_data = np.hstack((uk_data,ones_data)) # 拼接两组数据 final_data = np.vstack((us_data,uk_data)) print(final_data)
数组的拼接
-
# t1, t2为维数相同的数组 np.vstack((t1,t2)) # 竖直拼接 np.hstack((t1,t2)) # 水平拼接
数组的行列交换
-
t[[1,2],:] = t[[2,1],:] # 行交换 t[:,[0,2]] = t[:,[2,0]] # 列交换
例子:现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源)
# coding=utf-8
import numpy as np
us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"
#加载国家数据
us_data = np.loadtxt(us_data,delimiter=",",dtype=int)
uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int)
# 添加国家信息
#构造全为0的数据
zeros_data = np.zeros((us_data.shape[0],1)).astype(int)
ones_data = np.ones((uk_data.shape[0],1)).astype(int)
#分别添加一列全为0,1的数组
us_data = np.hstack((us_data,zeros_data))
uk_data = np.hstack((uk_data,ones_data))
# 拼接两组数据
final_data = np.vstack((us_data,uk_data))
print(final_data)
numpy更多好用的方法
1.获取最大值最小值的位置
-
np.argmax(t,axis=0)
-
np.argmin(t,axis=1)
2.创建一个全0的数组: np.zeros((3,4))
3.创建一个全1的数组:np.ones((3,4))
4.创建一个对角线为1的正方形数组(方阵):np.eye(3)
numpy随机生成数
numpy的注意点copy和view
- a = b 完全不复制,a, b相互影响
- a = b[ : ],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的。
- a = b.copy(),复制,a和b互不影响