当前位置:   article > 正文

python数据分析(三)——numpy读取本地数据和索引

numpy读取

系列文章:
python数据分析(一)——numpy数组的创建
python数据分析(二)——numpy数组的计算
python数据分析(四)——numpy中的nan和数据的填充
python数据分析(五)——numpy+matplotlib实例


一、轴(axis)

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

计算一个2维数组的平均值必须制定是计算哪个方向上面的数字平均值

np.arange(0, 10).reshape((2, 5))中,reshape中2表示0轴长度(包含数据的条数)为2,1轴长度为5,一共2*5=10个数据

二维数组:

  • 0表示行,1表示列
  • axis=0,从上到下,竖直方向对行操作;axis=1,从左到右,水平方向对列操作
    0表示行,1表示列
In [1]: t
Out[1]:
array([[0, 1, 2, 3],
	   [4, 5, 6, 7],
	   [8, 9, 10, 11]])

# 跨行求和
In [2]: np.sum(t, axis = 0)
Out[2]:
array([12, 15, 18, 21])

# 跨列求和
In [3]: np.sum(t, axis = 1)
Out[3]:
array([6, 22, 38])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三维数组:

  • 0表示块,1表示行,2表示列
  • axis=0,从外到内;axis=1,从上到下;axis=2,从左到右

在这里插入图片描述

二、numpy读取数据

CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

由于csv便于展示、读取和写入,所以很多地方也是用csv格式存储和传输中小型的数据

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

frame指的是文件路径,dtype指定数据类型,delimiter指定分割字符串,skiprows跳过哪一行,usecols选用哪一列,unpack表示转置,行列互换
在这里插入图片描述
np.loadtxt(US_video_data_numbers_path, delimiter = “,”, type = int, unpack = 1)

注意其中添加delimiterdtype以及unpack的效果

delimiter:指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错

dtype:默认情况下对于较大的数据会将其变为科学技术的方式

unpack:默认是False(0),默认情况下,有多少条数据,就会有多少行;True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,相当于转置的效果

01 数组转置

那么如何进行转置?

三种转置方法

In [45]: t
Out[45]:
array([[0, 1, 2, 3, 4, 5],
	   [6, 7, 8, 9, 10, 11],
	   [12, 13, 14, 15, 16, 17]])

In [46]: t. transpose()
Out[46]:
array([[0, 6, 12],
	   [1, 7, 13),
	   [2, 8, 14],
	   [4, 10, 16],
	   [5, 11, 17]])

In [47]: t. swapaxes(1,0)
Out[47]:
array([[0, 6, 12],
	   [1, 7, 13),
	   [2, 8, 14],
	   [4, 10, 16],
	   [5, 11, 17]])

In [48]: t.T
Out[48]:
array([[0, 6, 12],
	   [1, 7, 13),
	   [2, 8, 14],
	   [4, 10, 16],
	   [5, 11, 17]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

以上三种方法都可以实现二维数组的转置效果,转置和交换轴的效果一样

代码如下(示例):

# 三种转置方式
t1 = np.arange(24).reshape(4, 6)
print(t1)
print(t1.transpose())
print(t1.T)
print(t1.swapaxes(1, 0))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、numpy中的索引和切片

现在这里有一个英国和美国各自youtube1000多个视频的点击、喜欢、不喜欢、评论数量([“views”, “likes”, “dislikes”, “comment_total”])的cdv,运用所学的matplotlib把英国和美国的数据呈现出来?

  • 想要反映出什么样的结果,解决什么问题?
  • 选择什么样的呈现方式?
  • 数据还需要做什么样的处理?
  • 写代码

01 numpy索引和切片

对于刚刚加载出来的数据,如果只想选择其中某一列(行)的数据,应该怎么做?

numpy索引和切片

In [83]: a
Out[83]:
array([[0, 1, 2, 3],
	   [4, 5, 6, 7],
	   [8, 9, 10, 11]])

In [84]: a[1] #取一行
Out[84]:
array([4, 5, 6, 7])

In [85]: a[:, 2] #取一列
Out[85]:
array([2, 6, 10])

In [84]: a[1:3] #取多行 
Out[84]:
array([[4, 5, 6, 7],
	   [8, 9, 10, 11]])

In [85]: a[:, 2:4] #取多列
Out[85]:
array([[2, 3],
	   [6, 7],
	   [10, 11]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

代码如下(示例):

import numpy as np

us_file_path = "./Documents/python数据分析学习/youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./Documents/python数据分析学习/youtube_video_data/GB_video_data_numbers.csv"

us = np.loadtxt(us_file_path, delimiter = ",", dtype = "int")

print(us)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
# 取行
# print(us[2])

# 取连续的多行
# print(us[2:])

# 取不连续的多行
# print(us[[2, 8, 10]])

# 取列
# print(us[1, :])
# print(us[2:, :])
# print(us[[2, 10, 3], :])
# print(us[:, 0])

# 取连续的多列
# print(us[:, 2:])

# 取不连续的多列
# print(us[:, [0, 2]])

# 取行和列,取第3行,第4列的值
# print(us[2, 3])

# 取多行和多列,取第3行到第5行,第2列到第4列的结果
# 取的是行和列交叉点的位置
# 末端的值取不到,前开后闭区间
# print(us[2:5, 1:4])

# 取多个不相邻的点
# 选出来的结果是(0, 0) (2, 1) (2, 3)
# print(us[[0, 2, 2], [0, 1, 3]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

02 numpy中数值的修改

numpy数值修改

In [4]: t
Out[4]:
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]])
	   
In [6]: t[:, 2:4]
Out[6]:
array([[2, 3],
	   [8, 9],
	   [14, 15],
	   [20, 21]])
	   
In [7]: t[:, 2:4] = 0

In [8]: t
Out[8]:
array([[0, 1, 0, 0, 4, 5],
	   [6, 7, 0, 0, 10, 11], 
	   [12, 13, 0, 0, 16, 17],
	   [18, 19, 0, 0, 22, 23]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

如果条件更复杂,想要把t中小于10的数字替换为3,怎么实现?

In [9]: t2
Out[9]:
array([[0, 1, 0, 0, 4, 5],
	   [6, 7, 0, 0, 10, 11], 
	   [12, 13, 0, 0, 16, 17],
	   [18, 19, 0, 0, 22, 23]])

In [10]: t2<10
Out[10]:
array([[True, True, True, True, True, True],
	   [True, True, True, True, False, False], 
	   [False, False, False, False, False, False],
	   [False, False, False, False, False, False]], dtype = bool)

In [11]: t2[t2<10] = 3

In [12]: t2
Out[12]:
array([[3, 3, 3, 3, 3, 3],
	   [3, 3, 3, 3, 10, 11], 
	   [12, 13, 0, 0, 16, 17],
	   [18, 19, 0, 0, 22, 23]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

02_01 np.where()

numpy中的三元运算符

In [1]: t = np.arange(24).reshape(4, 6)

In [2]: t
Out[20]:
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的三元运算符
In [22]: np.where(t<10, 0, 10) 
Out[22]:
array([[0, 0, 0, 0, 0, 0],
	   [0, 0, 0, 0, 10, 10],
	   [10, 10, 10, 10, 10, 10],
	   [10, 10, 10, 10, 10, 10]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

02_02 .clip 裁剪

如果想把t中小于10的数字替换为0,把大于18的替换为18,应该怎么做?

numpy中的clip(裁剪)

In [1]: t
Out[1]:
array([[0, 1, 2, 3, 4, 5],
	   [6, 7, 8, 9, 10, 11],
	   [12, 13, 14, 15, 16, 17],
	   [18, 19, 20, nan, nan, nan]])

In [2]: t.clip(10, 18)
Out[2]:
array([[10, 10, 10, 10, 10, 10],
	   [10, 10, 10, 10, 11],
	   [12, 13, 14, 15, 16, 17],
	   [18, 18, 18, nan, nan, nan]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

小于10的替换为10,大于18的替换为18,但是nan没有被替换,那么nan是什么?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/142454
推荐阅读
相关标签
  

闽ICP备14008679号