备战数学建模27 & 科研必备 -Python之数值型数据处理numpy

目录

1-numpy的数组创建

2-numpy中数组的计算

3-numpy读取本地数据和索引

4-numpy中常用方法


numpy是在python中作科学计算的基础库,重在数值计算,多用于大型,多维数组上执行数值运算。

1-numpy的数组创建

废话不多说,都在代码里面了,程序员就要拿代码说话:

下面程序包含numpy创建数组的方法,数组类型设置与修改的方法,保留有效数字的方法

import numpy as np
import random

#使用numpy生成 数组,得到ndarray的数据类型
t1 = np.array([1,2,3])
t2 = np.array(range(10))
t3 = np.arange(10) #和上面的t2等价,生成0-9的数组
t4 = np.arange(4,10,2)#4,6,8组成的数组

print(t1)
print(type(t1))
print(t2)
print(t3)
print(t4)
print(t3.dtype) #数组中的数据类型
print("*" * 50)

#numpy中的数据类型
t5 = np.array(range(1,4),dtype=float)
print(t5)
print(t5.dtype)

#numpy中的bool类型
t6 = np.array([1,0,1,1,0], dtype=bool)
print(t6)
print(t6.dtype)

#修改dtype类型
t6 = t6.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)

2-numpy中数组的计算

数组形状得修改以及基本运算直接看下面代码:


import numpy as np
import random

#使用numpy生成 数组,得到ndarray的数据类型
t1 = np.arange(12)
print(t1.shape)

t2 = np.array([[1,2,3],[4,5,6]])
print(t2)
print(t2.shape) #返回行数和列数

t3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(t3)
print(t3.shape) #(2,2,3)

#reshape修改数组形状
t4 = np.arange(12)
print(t4.reshape(3,4))

t5 = np.arange(24).reshape(2,3,4)
print(t5) #(2,3,4)表示2块3行4列
t5 = t5.reshape(4,6)
print(t5)

#数据转换成一维
t6 = t5.reshape(t5.shape[0]*t5.shape[1],)
print(t6)

#和数字计算,广播机制,数组元素都加2
print(t6+2)
print(t6*2)
print(t6/2)
print(t6+t6)

3-numpy读取本地数据和索引

轴(axis)在numpy中可以理解为方向,可以使用数字0,1,2...来表示,对于一个一维数组,只有一个零轴,二维数组是0轴和1轴,三维数组是0,1,2轴。

axis=0是按列计算,axis=1是按行计算;

np.loadtxt()方法以文本文件方式加载文件,具体如下:

下面代码包含加载csv文件,以及对数组的转置,取行,取列,转置,修改,剪切等操作

​
file_path = "./data/ratings.csv"
#加载文件,用逗号分开,数据类型默认加载为浮点型,跳过第一行,因为我的第一行数据是字符串
t1 = np.loadtxt(file_path,delimiter=",",dtype="float",skiprows=1)
#unpack加上True属性后,就将数据的列变成行
t2 = np.loadtxt(file_path,delimiter=",",dtype="float",skiprows=1,unpack=True)
print(t1)
print("*" * 100)
print(t2)


#数组的转置
t2 = np.arange(24).reshape(4,6)
print(t2)
print("*" * 100)
print(t2.transpose()) #转置
print(t2.T) #转置


#取行
print(t2[2,:])#取出第3行
print("*" * 100)
#取连续的多行
print(t2[2:,:])
print("*" * 100)
#取不连续的多行
print(t2[[0,2]])
#取列
print(t2[:,1]) #取每一行的第2列
#取连续的多列
print(t2[:,1:])#从第2列开始向后取
#取不连续的多列
print(t2[:,[0,2]])#取第1列和第3列
#取行和列,比如取第1行第2列的值
print(t2[0,1])
#取行和列交叉位置的元素,取得第1行到第3行第2列到第3列
print(t2[0:3,1:3])
#取多个不相邻的点,取得对应位置的点
print(t2[[0,2],[1,2]])#(0,1)和(2,2)的点

#numpy中数值的修改
print(np.where(t2<10,0,10)) #小于10的值赋值给0,大于10的值赋值给10
print(t2[t2>10]) #找出t2中大于10的元素


#numpy中剪切
print(t2.clip(10,18)) #小于10的替换为10,大于18的替换为18

​

 演示上述数据加载过程的数据我浅传到我的Github上了,链接奉上:数据集链接戳这里!!!

4-numpy中常用方法

我们一般需要对加载的数据进行拼接,可以考虑从上到下拼接,也可以考虑从左到右拼接,

可以进行数据行列的交换。

python代码实现如下:

import numpy as np

t1 = np.array([[1,2,3],[4,5,6]])
t2 = np.array([[0,1,2],[3,4,5]])
print(t1)
print(t2)
print("*" * 100)
print(np.vstack([t1,t2])) #竖直拼接
print("*" * 100)
print(np.hstack([t1,t2]))#水平拼接
print("*" * 100)
t1[[0,1],:] = t1[[1,0],:] #行交换
print(t1)
print("*" * 100)
t1[:,[1,2]] = t1[:,[2,1]]#列交换
print(t1)

如果我们需要将两个不同的数据放到一起来研究,同时原始数据信息要保留,那么我们应该怎么办呢,废话不多说,看代码:

import numpy as np

us_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_path = "./youtube_video_data/GB_video_data_numbers.csv"

#加载国家数据
us_data = np.loadtxt(us_path,delimiter=",",dtype="int")
uk_data = np.loadtxt(uk_path,delimiter=",",dtype="int")

#添加国家数据
#构造一列全为0和全为1的数组
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中常用的方法,具体如下,包括生成0,1矩阵,单位矩阵,生成随机数等方法,废话不多数了,直接看代码吧:

import numpy as np
import random

t1 = np.zeros((2,3)) #创建2行3列的0矩阵
t2 = np.ones((2,3)) #创建2行3列的1矩阵
t3 = np.eye(4) #创建对角线为1的三阶矩阵
print(t1)
print(t2)
print(t3)
print(np.argmax(t3,axis=0)) #当前每一列最大值的位置
print(np.argmin(t3,axis=0)) #当前每一列最小值的位置

#numpy生成随机数
t4 = np.random.randint(10,20,(4,5))#随机生成4行5列的10到20直接的整数
print(t4)

nan表示非数值,inf表示无穷大,我们有些时候需要统计nan的个数,以及将数组中空余元素的位置赋值nan等操作,当然也需要统计非0元素,求和,求平均,求最值,求标准差等函数,废话不多话,看代码:

import numpy as np
import random


t1 = np.arange(10).astype(float)
print(np.nan == np.nan)
print(np.count_nonzero(t1)) #统计非0元素个数
t1[0] = np.nan
print(np.count_nonzero(np.isnan(t1)))
print(np.sum(t1))#nan与任何值计算结果都是nan

t2 = np.arange(24).reshape(4,6).astype(float)
t2[3,3] = np.nan
print(t2)
print(np.sum(t2,axis=0)) #按列求和
print(np.sum(t2,axis=1)) #按行求和
print(np.mean(t2,axis=0)) #按列求均值
t2[3,3] = 1
print(np.max(t2))#求矩阵的最大值
print(np.min(t2,axis=0))#按列求最小值
print(np.ptp(t2)) #求极值
print(t2.std()) #求标准差

对于数据中nan我们要将其变换成当前列不为nan的元素的均值,即将均值赋值给nan,让数据中没有nan的存在。废话不多说,上代码:

import numpy as np

def fill_ndarray(t1):
    for i in range(t1.shape[1]):
        temp_col = t1[:, i]  # 当前列
        nan_num = np.count_nonzero(temp_col != temp_col)
        if nan_num != 0:  # 当前列中有nan元素
            temp_col_not_nan = temp_col[temp_col == temp_col]
            #将当前列非nan元素的均值赋值给nan元素
            temp_col[np.isnan(temp_col)] = temp_col_not_nan.mean()
    return t1

if __name__ == '__main__':
    t1 = np.arange(12).reshape(3, 4).astype(float)
    t1[1, 2:] = np.nan
    print(t1)
    print("*" * 100)
    t1 = fill_ndarray(t1)
    print(t1)

到这里,也就快要到底了,那就做个简单的总结吧,都在下面的图里了,请看:

终于到了要结束的时候,我们根据所学内容做两个小题目吧,具体如下:

问题1的python代码如下:

import numpy as np
from matplotlib import pyplot as plt
us_path = "./youtube_video_data/US_video_data_numbers.csv"

#加载国家数据
us_data = np.loadtxt(us_path,delimiter=",",dtype="int")

#获取评论的数据,最后一列
t_comments = us_data[:,-1]
t_comments = t_comments[t_comments<5000] #选择比5000小的数据

d = 50 #组距
#组数
bin_num = (t_comments.max() - t_comments.min()) // d
#设置图片大小
plt.figure(figsize=(20,8),dpi=80)
#绘制直方图
plt.hist(t_comments, bin_num)
plt.show()

绘制的直方图如下:

问题2的python代码如下:

import numpy as np
from matplotlib import pyplot as plt


uk_path = "./youtube_video_data/GB_video_data_numbers.csv"

#加载国家数据
uk_data = np.loadtxt(uk_path,delimiter=",",dtype="int")

#选择喜欢数比500000小的数据
uk_data = uk_data[uk_data[:,1]<=500000]

t_uk_comments = uk_data[:,-1]
t_uk_like = uk_data[:,1]

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

上述代码绘制的散点图如下所示:

结束了,兄弟们,又是进步的一天,冲冲冲!!!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值