ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python_机器学习—数据科学库_DAY03

2021-10-10 17:03:55  阅读:127  来源: 互联网

标签:10 机器 python data print nan DAY03 np numpy


numpy

1. numpy基础

(1). numpy创建数组(矩阵)

import numpy as np
a=np.array([1,2,3,4,5])
b=np.array(range(1,6))
c=np.arange(1,6)
np.arange的用法:arange([start,] stop[,step,],dtype=None)

#数组的类名
a=np.array([1,2,3,4,5])
print(type(a))
运行结果:
numpy.ndarray

#数组的类型
print(a.dtype)
运行结果:
dtype('int64')

#指定创建的数组的数据类型
a=np.array([1,0,1,0],dtype=np.bool)  #或者使用dtype='?'
print(a)
运行结果:
array[True,False,True,False]

#修改数组的数据类型
print(a.astype('i1')) #或者使用a.astype(np.int8)
运行结果:
[1,0,1,0],dtype=int8

#修改浮点型的小数位
b=np.array([random.random() for i in range(10)])  #生成10个0到1的小数
print(b)
print(np.round(b,2))  #中的数字保留两位小数
运行结果:
[0.07859284 0.63999421 0.87230539 0.20005099 0.99937676 0.04664788
 0.11377768 0.05528047 0.88686356 0.7185658 ]
[0.08 0.64 0.87 0.2  1.   0.05 0.11 0.06 0.89 0.72]
0.012

#数组的形状
a=np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
print(a)
运行结果:
[[3 4 5 6 7 8]
 [4 5 6 7 8 9]]

#查看数组的形状
print(a.shape)
运行结果:
(2,6)    #第一个数字是行数,第二个数字是列数
#如果三个数的话第一个数字就是有几个矩阵

#修改数组的形状
print(a.reshape(3,4))
运行结果;
[[3 4 5 6]
 [7 8 4 5]
 [6 7 8 9]]

#数组的形状
a=np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
a.flatten()  #直接将多维数组变为一维数组
运行结果:
[3 4 5 6 7 8 4 5 6 7 8 9]

#加减乘除
print(a+1)
print(a-1)
print(a*2)
print(a/2)
运行结果:
[[2 3 4 5 6 7]
 [3 4 5 6 7 8]]
[[ 6  8 10 12 14 16]
 [ 8 10 12 14 16 18]]
[[1.5 2.  2.5 3.  3.5 4. ]
 [2.  2.5 3.  3.5 4.  4.5]]

数组间的加减乘除
a=np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
b=np.array([[21,22,23,24,25,26],[27,28,29,30,31,32]])
c=np.array(range(18))
c=c.reshape(3,6)
print(c)
d=np.array(range(2))
d=d.reshape(2,1)
print(a+b)
print(a*b)
print(a+c)  #会报错 因为没有任何一个维度是相同的
print(a+d)
print(a*d)  #只要是有一个维度相同就可以相加或者相减

运行结果:
[[24 26 28 30 32 34]
 [31 33 35 37 39 41]]
[[ 63  88 115 144 175 208]
 [108 140 174 210 248 288]]

[[ 3  4  5  6  7  8]
 [ 5  6  7  8  9 10]]
[[0 0 0 0 0 0]
 [4 5 6 7 8 9]]

(2). 轴(axis)

  • 二维数组的轴
    在这里插入图片描述
  • 三维数组的轴在这里插入图片描述

(3). numpy(读取数据)

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

参数解释
frame文件、字符串或生产器,可以是.gz或ba2压缩文件
dtpye数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认 np.float
delimiter分隔字符串,默认是任何空格,改为逗号
skiprows跳过前X行,一般跳过第一行表头
usecols读取指定列,索引,元组类型
unpack如果True,读入属性将分别写入不同数组变量,False读入数据只写一个数组变量,默认False

(4). numpy读取和存储数据

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

(5). numpy中的转置

  • 转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据
    转置的三种方法
import numpy as np
t=np.array(range(24))
t=t.reshape(4,6)

print(t.T)
print(t.transpose())
print(t.swapaxes)

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

(6). numpy索引和切片

import numpy as np
t=np.array(range(24))
t=t.reshape(4,6)
print(t)
print(t[1])  #取一行
print(t[1:3])  #取多行
print(t[:,2])  #取一列
print(t[:,2: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]]
[ 6  7  8  9 10 11]
[[ 6  7  8  9 10 11]
 [12 13 14 15 16 17]]
[ 2  8 14 20]
[[ 2  3]
 [ 8  9]
 [14 15]
 [20 21]]

(7). numpy中数值的修改

import numpy as np
t=np.array(range(24))
t=t.reshape(4,6)
t[:,2:4]=0
print(t)

运行结果:
[[ 0  1  0  0  4  5]
 [ 6  7  0  0 10 11]
 [12 13  0  0 16 17]
 [18 19  0  0 22 23]]

(8). numpy中布尔索引

import numpy as np
t=np.array(range(24))
t=t.reshape(4,6)
print(t)
print(t<10)
t[t<10]=0   #把小于10的赋为0
print(t)

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

(9). numpy中三元运算符

import numpy as np
t=np.arange(24).reshape(4,6)
print(t)
t=np.where(t<10,0,10)
#np.where 矩阵中小于10的变成0,大于10的变成10
print(t)

运行结果:
[[ 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  0  0  0  0  0]
 [ 0  0  0  0 10 10]
 [10 10 10 10 10 10]
 [10 10 10 10 10 10]]

(10). numpy中的clip(裁剪)

import numpy as np
t=np.arange(24).reshape(4,6)
print(t)
t=t.astype(float)
t[3,3:6]=np.nan  #将第四排的第四列到第六列,变成nan,注意字符格式
print(t.clip(10,18))  #小于10的替换为10,大于18的替换为了18

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

(11). 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)

numpy中的nan的注意点:

  1. 两个nan不相等
    IN:np.nan==np.nan
    OUT:False
    IN:np.nan!=np.nan
    OUT:True
  2. 利用上述的t矩阵,判断数组中nan的个数
    IN:np.count_nonzero(t != t)
    out:3
  3. 用np.isnan(t)来判断数字是否为nan,返回bool值类型,比如希望把nan替换为0
    IN:t[np.isnan(t)]=0
    OUT:print(t)
  4. nan和任何值计算结果都是nan
  • 那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
    比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
    结局方法
#coding=utf-8
import numpy as np
def fill_ndarray(t1):
    for i in range(t1.shape[1]):   #shape0是行数 shape1是列数
        temp_col=t1[:,i]   #当前的一列有没有nan
        nan_num = np.count_nonzero(temp_col!=temp_col)   #count_nonzero不是0的数有多少个
        if nan_num !=0: #不为0说明当前这一列中有nan
            temp_not_nan_col=temp_col[temp_col==temp_col]   #当前一列部位nan的array ,将等于的就赋值一下
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() #选中当前为nan的位置,把值 赋值为不为nan的均值
    return t1

if __name__=='__main__':
    t1=np.arange(24).reshape(4,6).astype('float')
    t1[3,3:6]=np.nan
    print(t1)
    t1=fill_ndarry(t1)
    print(t1)

运行结果:
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. nan nan nan]]
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20.  9. 10. 11.]]

(12). 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) (标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,约不稳定。)

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

(13). 解决问题

#coding=utf-8
'''
1.英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图
'''
import numpy as np
from matplotlib import pyplot as plt
us_file_path='./youtube_video/US_video_data_numbers.csv'
uk_file_path='./youtube_video/GB_video_data_numbers.csv'

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

#取评论的数据
t_us_comments=t_us[:,-1]  #-1就是最后一列


#选择比5000小的数据
t_us_comments=t_us_comments[t_us_comments<=5000]
print(t_us_comments.max(),t_us_comments.min())

d=50
bin_nums=(t_us_comments.max()-t_us_comments.min())//d

#绘制直方图
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comments,bin_nums)

plt.show()

运行结果:
在这里插入图片描述

#coding=utf-8
'''
2.希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图
'''
import numpy as np
from matplotlib import pyplot as plt
us_file_path='./youtube_video/US_video_data_numbers.csv'
uk_file_path='./youtube_video/GB_video_data_numbers.csv'

t_uk=np.loadtxt(uk_file_path,delimiter=',',dtype='int')
t_uk=t_uk[t_uk[:,1]<=500000]

t_uk_comment = t_uk[:,-1]  #评论数
t_uk_like = t_uk[:,1]  #喜欢数


plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_comment,t_uk_like)   #散点图

plt.show()

运行结果:
在这里插入图片描述

(14). 数组的拼接

  1. 竖直拼接
    np.vstack((t1,t2))
  2. 水平拼接
    np.hstack((t1,t2))

拆分就是拼接的反方向,不要搞混

练习:

#coding=utf-8
'''
现在希望把之前案例中两个国家的数据方法一起来研究分析,同时保留国家的信息(每条数据的国家来源),应该怎么办
'''
import numpy as np
us_data='./youtube_video/US_video_data_numbers.csv'
uk_data='./youtube_video/GB_video_data_numbers.csv'
# 加载国家数据
us_data=np.loadtxt(us_data,delimiter=',',dtype='int')
uk_data=np.loadtxt(uk_data,delimiter=',',dtype='int')

#添加国家信息
#构造全为0的数据 np.zeros((行,列))
zeros_data=np.zeros((us_data.shape[0],1)).astype('int')
#构造全为1的数据 np.ones((行,列))
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))

#拼接两块数据
fin_data=np.vstack((us_data, uk_data))
print(fin_data)

运行结果:
[[4394029  320053    5931   46245       0]
 [7860119  185853   26679       0       0]
 [5845909  576597   39774  170708       0]
 ...
 [ 109222    4840      35     212       1]
 [ 626223   22962     532    1559       1]
 [  99228    1699      23     135       1]]

(15). 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)

(16). numpy生成随机数

在这里插入图片描述

(17). numpy的注意点copy和view

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

标签:10,机器,python,data,print,nan,DAY03,np,numpy
来源: https://blog.csdn.net/dongdZss/article/details/120682775

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有