数据科学库笔记(三)Numpy

(一) Numpy

什么是Numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算

(二) Numpy创建数组(矩阵)

2.1 创建数组

import numpy as np

# 下面a,b,c内容相同
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)

print(a)
print('**********')
print(b)
print('**********')
print(c)

Out:

[1 2 3 4 5]
**********
[1 2 3 4 5]
**********
[1 2 3 4 5]

2.2 np.arange()的用法

np.arange()函数分为三种情况:一个参数两个参数三个参数三种情况

  • (1)一个参数时,参数值为终点,起点取默认值0,步长取默认值1。
  • (2)两个参数时,第一个参数为起点,第二个参数为终点,步长取默认值1。
  • (3)三个参数时,第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数

2.3 数组的类名

# 数组的类名
print("数组的类名")
a = np.array([1,2,3,4,5])
print(type(a))

# 数据的类型
print('数据的类型')
print(a.dtype)

Out:

数组的类名
<class 'numpy.ndarray'>
数据的类型
int32

2.3 numpy中常见的更多数据类型

在这里插入图片描述

# 指定创建的数组的数据类型
print('\n指定创建的数组的数据类型')
a = np.array([1,0,1,0],dtype=np.bool) # 或者写成dtype='?'
print(a)

# 修改数组的数据类型
print('\n修改数组的数据类型')
print(a.astype("i1")) # 或者使用a.astype(np.int8)

# 修改浮点型的小数位数
print('\n修改浮点型的小数位数')
b = [0.0485436,0.26320639,0.6964613,0.71811003,0.3576838,
     0.58919477,0.84757749,0.52428633,0.486302,0.48908838]
print(np.round(b,2))

Out:

指定创建的数组的数据类型
[ True False  True False]

修改数组的数据类型
[1 0 1 0]

修改浮点型的小数位数
[0.05 0.26 0.7  0.72 0.36 0.59 0.85 0.52 0.49 0.49]
# 查看数组的形状
print('\n查看数组的形状')
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
print(a.shape)

# 修改数组的形状
print('\n修改数组的形状')
print(a.reshape(3,4))  # 这不是永久改变数组类型
print(a.shape)

# 把数组转化为一维数组
print('\n这不是一维数组')
print(a.reshape(1,12))
print('\n这是一维数组')
print(a.flatten())

# 加法和乘法
print('\n加法和惩罚')
print(a+1)
print('***********************')
print(a*3)

Out:
查看数组的形状
(2, 6)

修改数组的形状
[[3 4 5 6]
 [7 8 4 5]
 [6 7 8 9]]
(2, 6)

这不是一维数组
[[3 4 5 6 7 8 4 5 6 7 8 9]]

这是一维数组
[3 4 5 6 7 8 4 5 6 7 8 9]

加法和惩罚
[[ 4  5  6  7  8  9]
 [ 5  6  7  8  9 10]]
***********************
[[ 9 12 15 18 21 24]
 [12 15 18 21 24 27]]

2.4 广播原则

在这里插入图片描述
怎么理解呢?
可以把维度指的是shape所对应的数字个数。
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
答:不能,因为(3,3,3)的数组不含有(3,2)的数组的形式。
shape为(3,3,2)的数组能够和(3,2) 或(3,3)的数组进行计算么?
答:能,因为(3,3,2)的数组包含(3,2) 或(3,3)的数组的形式。

2.5 轴

在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
二维数组的轴
在这里插入图片描述
三维数组的轴
在这里插入图片描述

(三) numpy读取数据

3.1 读取数据

CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:

  • 换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录。
  • 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的。
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

在这里插入图片描述
实例:
现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量([“views”,“likes”,“dislikes”,“comment_total”])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作

数据来源:https://www.kaggle.com/datasnaek/youtube/data
百度网盘分享链接:https://pan.baidu.com/s/1ZCHPES9krGN9yxZqml97ow
提取码:ne9r
实例

import numpy as np
from matplotlib import pyplot as plt

us_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/us_videos_data_numbers.csv"
uk_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/gb_videos_data_numbers.csv"

#t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_uk = np.loadtxt(uk_file_path,delimiter=",",dtype="int")

t_uk=t_uk[t_uk[:,1]<=100000]

t_uk_comment = t_uk[:,-1]
t_uk_like = t_uk[:,1]
#t_uk_like = t_uk_like[t_uk_like<=10000]会出现size报错,必须写t_uk=t_uk[t_uk[:,1]<=100000]

plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_comment)

plt.show()

在这里插入图片描述

在这里插入图片描述

3.2 numpy中的转置

# 转置
t = [[0, 1, 2 ,3, 4,  5],
     [6, 7, 8, 9, 10,11],
     [12,13,14,15,16,17]]
print('\n源仔')
print(t)
print("源仔")
print(np.transpose(t))

Out:

源仔
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]
源仔
[[ 0  6 12]
 [ 1  7 13]
 [ 2  8 14]
 [ 3  9 15]
 [ 4 10 16]
 [ 5 11 17]]

3.3 numpy索引和切片

取行一般冒号在后面或者后面冒号省略;取列一般冒号在前或者前面冒号省略
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
问题如果我们想把t中小于10的数字替换为0,把大于10的替换为10,应该怎么做??
在这里插入图片描述

  • **numpy中的clip(裁剪)**
    在这里插入图片描述
  • clip(10,18): 小于10的替换为10,大于18的替换为了18
  • 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类型
在这里插入图片描述
numpy中的nan的注意点
在这里插入图片描述

3.3 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)

标准差:是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定

实战
题目:英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图;希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图

import numpy as np
from matplotlib import pyplot as plt

us_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/us_videos_data_numbers.csv"
uk_file_path = "D:/拜师教育/课程资料/数据结构基础/第二章:数据科学库基础/14100_HM数据科学库课件/DataAnalysis-master/datasourse/视频数据/gb_videos_data_numbers.csv"

#t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t_us = np.loadtxt(uk_file_path,delimiter=",",dtype="int")

#取评论的数据
t_us_comment=t_us[:,-1] #表示取最后一列

# 选择比10000小的数据
t_us_comment = t_us_comment[t_us_comment<=10000]

print(t_us_comment.max(),t_us_comment.min())

d = 100

bin_nums = (t_us_comment.max()-t_us_comment.min())//d

# 绘图
plt.figure(figsize=(20,8),dpi=80)

plt.hist(t_us_comment,bin_nums)

plt.show()

在这里插入图片描述

(四)数组的拼接

4.1 矩阵的转换和拼接

  • np.vstack((t1,t2)) # 竖直拼接t1和t2矩阵vertically

  • np.hstack((t1,t2)) # 水平拼接t1和t2矩阵horizontally

  • 行列转换

如下实例:

import numpy as np

t1 = [[0,1,2,3,4,5,],
      [6,7,8,9,10,11]]

t2 = [[1,1,12,3,7,5,],
      [4,7,14,9,0,11]]

print(t1)
print("**************")
print(t2)

T1 = np.vstack((t1,t2)) # 竖直拼接vertically
print('**************')
print(T1)
T2 = np.hstack((t1,t2)) # 水平拼接horizontally
print("**************")
print(T2)

T1 = np.vstack((t1,t2)) # 竖直拼接vertically
print('**************')
print(T1)
T2 = np.hstack((t1,t2)) # 水平拼接horizontally
print("**************")
print(T2)

t3 = np.arange(12,24).reshape(3,4)
print('\n行列交换')
print(t3)
t3[[1,2],:] = t3[[2,1],:]
T3_1 = t3
print('行交换')
print(T3_1)
t3[:,[0,2]] = t3[:,[2,0]]
T3_2 = t3
print('列交换')
print(T3_2)

Out:

[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
**************
[[1, 1, 12, 3, 7, 5], [4, 7, 14, 9, 0, 11]]
**************
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [ 1  1 12  3  7  5]
 [ 4  7 14  9  0 11]]
**************
[[ 0  1  2  3  4  5  1  1 12  3  7  5]
 [ 6  7  8  9 10 11  4  7 14  9  0 11]]

	行列交换
[[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]]

Process finished with exit code 0

4.2 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)

4.3 numpy生成随机数

np.random.····
在这里插入图片描述

t = np.random.randint(0,20,(3,4))
print('\n源仔')
print(t)

t_5 = np.random.seed(10)
print('\n源仔')
print(t_5)

Out:

源仔
[[18 17 17 17]
 [16 17 13 10]
 [ 7  2 16 15]]
 第二次运行结果:
源仔
[[ 6  1  1 18]
 [17 15 18  6]
 [12 10  6 16]]

4.4 numpy的注意点copy和view

  • a=b 完全不复制,a和b相互影响
  • a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
  • a = b.copy(),复制,a和b互不影响

猜你喜欢

转载自blog.csdn.net/weixin_54546190/article/details/118917068