Numpy数值处理

Numpy数值处理

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

01 数组的属性

1. 数组类型+类型转化:
import random
import numpy as np

# numpy的数组类型 <class 'numpy.ndarray'>
# numpy对数组中数据的类型t1.dtype: int64 (与电脑位数有关)
# 生成数组的多种方法
t1 = np.array([1, 2, 3, 4, 5])
t2 = np.array(range(10))
t3 = np.arange(10)
# 可以通过dtype指定数据类型
t4 = np.array(range(1, 4), dtype="i1")

# 调整数据类型
t6 = t4.astype("int8")

# numpy中的小数
t7 = np.array([random.random() for i in range(10)])
# decimals改变小数位数
t8 = np.round(t7, 2)
2. 数组的形状:
import numpy as np

t1 = np.arange(12)
t2 = np.array([[1, 2, 3], [4, 5, 6]])
t3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])

# reshape会返回一个新数组的视图,但是不会改变原数组
# 3行4列
t1 = t1.reshape((3, 4))
t5 = t1.reshape((t1.shape[0] * t1.shape[1],))
# 将数组转化成一维数组 flatten()
t5.flatten()

# reshape的形参:块数:2,每块行数:3,每块列数:4
t4 = np.arange(24).reshape((2, 3, 4))
# print(t4)

"""
# shape属性中有几个数就是几维 reshape也一样
print(t1.shape)
print(t2.shape)
print(t3.shape)
"""
print(t5)

02 运算:

1. 数组和数字进行运算:

运算对于数组内每一个元素都会进行 ±*/

2. 数组和数组进行运算:
  1. 行数列数都一样:对应位置相加
  2. 如果数组行数其中有一个为1,列数一样:每行对应位置进行运算
  3. 如果数组列数其中有一个为1,行数一样:每列对应位置进行运算
  4. 具体情况具体分析:难以描述
  5. 广播原则
3. 轴 (axis): (0 1 2)

与shape属性中的几个数有关

4. 转置
# 三种方法实现二维数组的转置
# unpack=True
t = np.arange(18).reshape((3, 6))
t2 = t.transpose()
t3 = t.swapaxes(1,0)
t4 = t.T

03 读取数据:

主要使用的代码:从文本文件中加载数据

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

# 结合matplotlib将数据呈现出来

us_file_path = "US_video_data_numbers.csv"
uk_file_path = "GB_video_data_numbers.csv"

# 如果unpack=True:行变列,列变行(转置)
t1 = np.loadtxt(us_file_path, delimiter=",", dtype="int")
t2 = np.loadtxt(uk_file_path, delimiter=",", dtype="int", )

# 取不连续的多行,需要加一个中括号
print(t1[[2, 8, 10]])
print(t1[[2, 8, 10], :])

# 取列
print(t2[:, 0])

# 取连续多列
print(t1[:, 0:2])

# 取不连续多列
print(t1[:, [0, 1, 3]])

# 取多行和多列 (不相邻的点) # 需要一一对应
print(t1[[2, 8, 10], [1, 2, 3]])
2. 数值的修改
  1. 正常修改直接赋值即可

  2. 把所有小于10的赋值:t2[t2<10] = 3

  3. 三目运算符:t = np.where(t < 10, 0, 10)

  4. Clip(裁剪)t = t.clip(10, 18) 将小于10的替换为10,大于18的替换为18

3. 数组的拼接
  1. 竖直拼接:np.vstack((t1, t2))
  2. 水平拼接:np.hstack((t1, t2))
import numpy as np

t1 = np.arange(12).reshape((2, 6))
t2 = np.arange(12, 24).reshape(2, 6)

t_v = np.vstack((t1, t2))
t_h = np.hstack((t1, t2))
  1. 行列交换
# 交换行
t1[[0, 1], :] = t1[[1, 0], :]

# 交换列
t1[:, [2, 5]] = t1[:, [5, 2]]

练习:

import numpy as np

# 加载国家数据
us_data_path = "./dataset_numpy/US_video_data_numbers.csv"
uk_data_path = "./dataset_numpy/GB_video_data_numbers.csv"

us_data = np.loadtxt(us_data_path, delimiter=",", dtype=int)
uk_data = np.loadtxt(uk_data_path, delimiter=",", dtype=int)

# 添加国家信息
# 构造全为0的数据
zero_data = np.zeros((us_data.shape[0], 1)).astype(int)
ones_data = np.ones((uk_data.shape[0], 1)).astype(int)

# 拼接两组数据
us_data = np.hstack((us_data, zero_data))
uk_data = np.hstack((uk_data, ones_data))

final_data = np.vstack((us_data, uk_data))
print(final_data)

04 numpy更多好用的方法:

  1. 获取最大值最小值的位置
    1. np.argmax(t, axis=0)
    2. np.argmin(t, axis=1)
  2. 获取最大值最小值:
    1. np.max(t)
    2. np.min(t)
  3. 创建一个全0的数组:np.zerios((3, 4))
  4. 创建一个全1的数组:np.ones((3, 4))
  5. 创建一个对角线为1的正方形数组(方阵):np.eye(3)
  6. numpy生成随机数:numpy.random
  7. numpy的copy()view()
    1. a=b, 完全不复制,相互影响(浅拷贝
    2. a = b[:], 视图操作,会创建新的对象a,数据变化一致(a的数据完全由b保管)
    3. a=b.copy()复制, a和b互不影响

05 numpy中的nan和inf:

Nan: not a number 表示不是一个数组

Inf: 正无穷,-inf:负无穷

  1. 两个nan是不相等的

    1. 通过这个特性判断数组中nan的个数
    np.count_nonzero(t!=t)
    
    1. 希望把nan替换为6
    t[np.isnan(t)]=0
    
  2. nan和任何值计算都为nan**(有影响)**

    1. 替换之前的平均值如果大于0,替换之后的均值一定会变小
    2. 更一般的方式:将缺失的数值替换为均值,或者删除有缺失值的一行

06 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,则返回一个当前轴上的结果

将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:
            temp_non_nan_col = temp_col[temp_col == temp_col]
            temp_col[np.isnan(temp_col)] = temp_non_nan_col.mean()

    print(t1)
    return t1


if __name__ == '__main__':
    t1 = np.arange(24).reshape((4, 6)).astype("float")
    t1[1, 2:] = np.nan
    t1 = fill_ndarray(t1)

07 练习+总结:

  1. 英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图 (以美国为例)
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")

# 加载国家数据
us_data_path = "./dataset_numpy/US_video_data_numbers.csv"
uk_data_path = "./dataset_numpy/GB_video_data_numbers.csv"

t_us_data = np.loadtxt(us_data_path, delimiter=",", dtype=int)
t_uk_data = np.loadtxt(uk_data_path, delimiter=",", dtype=int)

# 取评论的数据
t_us_comments = t_us_data[:, -1]
t_uk_comments = t_uk_data[:, -1]

# 选择比5000小的数据
t_us_comments = t_us_comments[t_us_comments <= 5000]
t_uk_comments = t_uk_comments[t_uk_comments <= 5000]

# print(t_us_comments.max())
# print(t_us_comments.min())

d = 250
num_bins = int((t_us_comments.max() - t_us_comments.min()) / d)

plt.figure(figsize=(20, 8), dpi=80)
plt.hist(t_us_comments, num_bins,label="美国的评论数量")
plt.xticks(range(min(t_us_comments), max(t_us_comments)+d, d), rotation=45)
plt.xlabel("评论数量", fontproperties=my_font)
plt.ylabel("频数",fontproperties=my_font)

plt.legend(loc="upper right",prop=my_font)
plt.grid(alpha=0.6)
plt.show()
  1. 希望了解英国的YouTube中视频的评论数和喜欢数的关系,应该如何绘图
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname="/System/Library/Fonts/PingFang.ttc")

uk_data_path = "./dataset_numpy/GB_video_data_numbers.csv"

t_uk_data = np.loadtxt(uk_data_path, delimiter=",", dtype=int)
# 选择喜欢数比50万小的
t_uk_data = t_uk_data[t_uk_data[:, 1] <= 500000]

t_uk_comment = t_uk_data[:, -1].astype(int)
t_uk_like = t_uk_data[:, 1].astype("int")

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

plt.scatter(t_uk_like, t_uk_comment)

plt.show()

学习课程来源:

【【python教程】数据分析——numpy、pandas、matplotlib】
https://www.bilibili.com/video/BV1hx411d7jb?p=13&vd_source=60fe04a9d6b8a78937ea6e0fb8eb7b0b

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值