Python之Numpy入门教程

本文介绍了numpy库的基本使用,包括创建和操作数组、数据类型、形状变换、数组计算、读取数据、索引切片、数值修改、布尔索引、三元运算、数值裁剪、nan与inf处理以及常用统计函数。还展示了如何通过numpy处理和分析数据,例如对YouTube视频数据进行统计分析。
摘要由CSDN通过智能技术生成

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的注意点
  1. 两个nan是不相等的

  2. np.nan != np.nan 为 true

  3. 利用以上的特殊性,判断数组中nan的个数

  4. 由于2,如何判断一个数字是否为nan呢?

    通过np.isnan(a)来判断,返回bool类型,比如希望把nan替换为0

  5. nan和任何值计算都为nan

  6. 替换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.获取最大值最小值的位置

  1. np.argmax(t,axis=0)

  2. 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值