数据大清洗_Numpy数组基础

一、numpy的认识

Numpy 是用于数据科学计算的基础,不但能够完成科学计算任务,还能被用作高效地多
维数据容器。用于存储和处理大型矩阵。
Python 提供了一个 array 模块,和 list 不同,它直接保存数值,但是由于 Python 的 array 模块不支持多维,也没有各种运算函数。

Numpy 弥补了这一遗憾。Numpy 提供了一种数组对象——ndarray(下文统称数组)

二、数组创建

1、Numpy.array 函数创建一维或多维数组
numpy.array (object, dtype=None, copy=True, order=‘K’,subok=False, ndmin=0)
表 2-1 numpy.array 函数参数说明
在这里插入图片描述

import numpy as np

# 可以通过np.array来创建数组
arr1 = np.array([1, 2, 3, 4, 5, 6])
print(arr1)  # [1 2 3 4 5 6]
# print(type(arr))  # <class 'numpy.ndarray'>

# 创建二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr)
print(type(arr))

其他创建数组的方式:

import numpy as np

# 方法1:固定值数组创建
# 创建一个一维数组
# 参数1 开始位置
# 参数2 结束位置(默认不包含)
# 参数3  步长
# arr = np.arange(0, 10, 2)
# print(arr)  # [0 2 4 6 8]
# # 如果开始位置为0,且步长为1 --->可以同时省略
# arr = np.arange(12)
# print(arr)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]

# 方法2:linspace ---创建等差数组 ----后一个元素- 前一个元素的差值 ---恒定的
# 参数1 开始位置
# 参数2 结束位置(默认包含结束位置)
# 参数3 创建的数组的元素的个数,如果不指定默认为50
# arr = np.linspace(0, 10)
# print(arr)

# 方法3:logspace ---创建等比数组 ---后一个元素/前一个元素 ---恒定的
# 参数1 开始位置
# 参数2 结束位置
# 参数3 创建的数组的元素的个数
# base ---默认为10,可以更改
# arr = np.logspace(0, 5, 6, base=2)  # [ 1.  2.  4.  8. 16. 32.]     2的0次方,2的1次方...2的5次方  6个数
# print(arr)


# 创建全部为0  或者全部为1 的数组 ----占位
# 参数:创建的数组的形状
# arr = np.ones((2, 3))  # 全部为1
# arr = np.zeros((2, 3))  # 全部为0
# print(arr)

# 创建一个类似于对角矩阵的数组
# arr = np.diag([1, 2, 3, 4])
# print(arr)

# 创建一个类似于单位矩阵的数组
# arr = np.eye(3)
# print(arr)

# 创建随机数组
# 创建[0,1)的均匀分布的数组
# 均匀分布--->大量数据得到的结论 ---应用于少量数据 ---->推不出最终结论的
# 参数 ---生成的数组的元素个数或者生成数组的形状
# arr = np.random.random(10)
# arr = np.random.random((2, 3))
# print(arr)

# 创建一个符合标准正态分布的数组
# 标准正态分布 ---u=0,a=1特殊的正态分布
# 参数: 生成的数组的元素个数或者生成数组的行、列数
# arr = np.random.randn(10)
# arr = np.random.randn(2, 3)
# # arr = np.random.randn((2, 3)) # 错误的,不能给定形状
# print(arr)

# 生成一个[low,high)指定范围内的随机整数数组
# 参数 low---最小值
# 参数 hight--- 最大值(不包含)
# 参数 size --元素个数或者数组的形状
# arr = np.random.randint(low=0, high=20, size=(2, 3))
# print(arr)

三、数组属性

Ndarray 是一个数组对象,对象都拥有以下属性:在这里插入图片描述

import numpy as np

# ndim shape size  dtype  itemsize

# 使用np.array来创建一维数组
# arr = np.array([1, 2, 3, 4, 5, 6])
# print(arr)
# print(type(arr))

# print('数组的元素的个数:\n',arr.size)
# print('数组中的元素的占位大小:\n', arr.itemsize)  # 4字节
# print('数组中的元素类型:\n', arr.dtype)  # int32 ---32位平台的int类型

# print('数组的形状:\n', arr.shape)  # --->元组 --->(6,) --->第0个元素---指的是列维度的数量
# print('数组的维度:\n', arr.ndim)  # --->1维 --->列维度


# 使用np.array来创建二维数组
# arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
# print(arr)
# print(type(arr))
# 
# print('数组的元素的个数:\n', arr.size)
# print('数组中的元素的占位大小:\n', arr.itemsize)  # 4字节
# print('数组中的元素类型:\n', arr.dtype)  # int32 ---32位平台的int类型
# 
# print('数组的形状:\n', arr.shape)  # --->元组 ---> (2, 4) -->分别指的是行维度、列维度的数量
# print('数组的维度:\n', arr.ndim)  # --->2维 ---> 行、列两个维度


# 使用np.array来创建三维数组
#arr = np.array([[[1, 2, 3, 4], [5, 6, 7, 8]], [[1, 2, 3, 4], [5, 6, 7, 8]]])
# print(arr)
# print(type(arr))
#
# print('数组的元素的个数:\n', arr.size)
# print('数组中的元素的占位大小:\n', arr.itemsize)  # 4字节
# print('数组中的元素类型:\n', arr.dtype)  # int32 ---32位平台的int类型
#
# print('数组的形状:\n', arr.shape)  # --->元组 ---> (2, 2, 4) ---分指的是块维度、行维度、列维度所对应的数目
# print('数组的维度:\n', arr.ndim)  # --->3维  ---> 块维度、行维度、列维度

数据元素类型

在实际业务数据处理时,为了更精确的计算结果,需要使用不同的数据类型。Numpy 极大程度地扩充了原生 python 数据类型,其中大部分数据类型是以数字结尾的。
在这里插入图片描述

numpy 中的数据类型也可以进行强制转换,如:

import numpy as np

# numpy 数据类型---封装了Python中的数据类型---进行细致划分 --->变为numpy.数据类型
# 可以创建数组的时候进行通过dtype参数指定
arr = np.array([1, 2, 3, 4, 5, 6], dtype=np.float64)
print(arr)
print(arr.dtype)

# 也可以进行强制转化
print(np.float(3))
print(np.int32(3.0))
# 0代表False, 非0代表True
print(np.bool(1))
print(np.bool(0))

ndarray 用来存储单一数据类型的数据 —运算的:

import numpy as np

# ndarray 用来存储单一数据类型的数据 ---运算的
# 也可以用来存储 复合类型 --不推荐使用
# 存储个人信息
df = np.dtype([('name', np.str, 40), ('height', np.float64), ('weight', np.float64)])
# 创建一个数组
arr = np.array([('zs', 178.0, 55.5), ('ls', 180.5, 65.0), ('ww', 190.0, 80.5)], dtype=df)
print(arr)

# 创建bool数组---里面值全是bool类型的数组
bool_mask = np.array([0, 1, 1, 0], dtype=np.bool)
print(bool_mask)

四、数组索引(数组元素查询)

import numpy as np

# # 创建一个一维数组
# arr = np.arange(1, 13, 1)
# print(arr)
#
# print('arr的维度:', arr.ndim)
# print('arr的形状:', arr.shape)
# print('*' * 100)
#
# # 使用下标--会降低维度
# # 获取 3 ---下标
# print('获取3元素:', arr[2])
# # 获取11 --下标
# print('获取11元素:', arr[-2])
#
# # 使用切片不降低维度
# # 获取3 --切片 ---步长为1 可以省略
# print('获取3元素:', arr[2:3:1])
#
# # 获取11 --切片
# print('获取11元素:', arr[-2:-1:1])
#
# # 获取 3 和 11  -->下标列表
# # ---先获取到具体的值,然后将获取多个值组合起来,就得到最终的结果
# print('获取3和11元素:', arr[[2, -2]])
#
# # 获取3 和 11 ---按照规律
# print('获取3 和11元素:', arr[2:-1:8])

# 创建二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
print(arr)
print('arr的维度:', arr.ndim)
print('arr的形状:', arr.shape)

# # 获取 5元素 ---下标
# print('获取5元素:', arr[1, 0])
#
# # 获取11 元素---下标
# print('获取11元素:', arr[2, 2])
#
# # 获取 5元素 --切片
# print('获取 5元素:', arr[1:2, 0:1])
#
# # 获取 11 元素---切片
# print('获取11元素:', arr[2:3, 2:3])
#
# # 获取5 元素 --下标、切片配合
# print('获取5 元素:', arr[1, 0:1])
#
# # 获取11元素 --下标、切片配合
# print('获取11元素:', arr[2:3, 2])
#
# # 获取多个元素
# # 获取 6  7  10  11  -下标列表 ---将多个具体的值组合起来
# print('获取6 7 10 11:', arr[[1, 1, 2, 2], [1, 2, 1, 2]])
#
# # 获取6 7 10 11 --切片
# #  [[ 6  7]
# #  [10 11]]
# print('获取6 7 10 11:\n', arr[1:3, 1:3])
#
# # 获取 6  8 13  16  ---下标列表
# print('获取6 8 13 16:', arr[[1, 1, 3, 3], [1, 3, 0, 3]])

# 存在arr ---3维 ---->arr[块索引,行索引,列索引]
# 存在arr ---n维 ---->arr[n-1个逗号将各个维度分开] 在各个维度上单独索引


# 索引方式---思维方式
# 获取 7 元素
# print('获取7元素:', arr[1][2])  # 高维度是由多个低维度组成

# bool数组索引
# 利用bool数组的特性来进行索引
# 数组里面全部为 bool值的数组
bool_mask = np.array([0, 1, 1, 0], dtype=np.bool)
print(bool_mask)
# 利用bool数组索引
# 保留True 干掉False
print('bool数组索引:\n', arr[bool_mask, :])  # 保留行
# print('bool数组索引:\n', arr[:, bool_mask])  # 保留列


# 参考都使用下标列表形式理解
# arr[[F,T,T,F],[F,T,T,F]]
# print('bool数组索引:\n', arr[bool_mask, bool_mask])

五、数组形状变换

1、基于 shape 属性变换

import numpy as np

# 创建数组
# arr = np.arange(16)
# print(arr)
# print('arr的维度:', arr.ndim)
# print('arr的形状:', arr.shape)
# print('*' * 100)

# 元素个数不能变化
# 形状更改 ---shape属性重新赋值
# arr.shape = (4, 4)
# print(arr)

2、基于reshape属性变换

import numpy as np

# 同时使用np.arange 和 reshape
arr = np.arange(16).reshape((4, 4))
print(arr)

此时还需要注意一种情况,就是 reshape((-1,1))这样的情况,如:

import numpy as np

# 同时使用np.arange 和 reshape
arr = np.arange(16).reshape((4, 4))
print(arr)

# -1 只是占位作用
new_arr = arr.reshape((-1, 1))
print(new_arr)

3、基于 np.flatten 与 np.ravel 函数变换

那么思考一个问题:可以使用 np.arange 和 reshape 可以创建高维度数组,那么如何将
高维度数组展开为一维呢?

import numpy as np

# 同时使用np.arange 和 reshape
arr = np.arange(16).reshape((4, 4))
print(arr)

# 将高维度 展开为一维数组
# new_arr = arr.flatten()  # flatten:变平  返回的是一个拷贝[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
# 参数 C --行优先展开
# F---列优先展开
# new_arr = arr.ravel(order="C")  # 返回自身的视图
# print(new_arr)

六、数组合并与拆分

1、数组合并

可以使用 np.hstack、np.vstack、np.concatenate 来进行数组的拼接合并。
推荐使用np.concatenate

import numpy as np

# 创建数组
arr1 = np.arange(4).reshape((2, 2))
arr2 = np.array([[0, 1], [0, 1]])
print('arr1:\n', arr1)
print('arr2:\n', arr2)
print('*' * 100)

# 合并
# 向下拼接 ----垂直拼接
# res = np.vstack((arr1,arr2))
# print(res)

# 向右拼接 ----水平拼接
# res = np.hstack((arr1, arr2))
# print(res)

# # 行的方向进行拼接---垂直拼接
res = np.concatenate((arr1, arr2), axis=0)
print(res)
#
# # 列的方向进行拼接---水平拼接
# res = np.concatenate((arr1, arr2), axis=1)
# print(res)

2、数组拆分

可以使用 np.hsplit、np.vsplit、np.split 来将数组进行拆分
推荐使用np.split

import numpy as np

# 创建数组
arr = np.arange(16).reshape((4, 4))
print(arr)
print('*' * 100)

# 第二个必须是能够被整除的,均匀拆分
# 水平拆分  ---将水平的行 打断
# res = np.hsplit(arr, 2)
# print(res)

# 垂直拆分 ---将垂直的列 打断
# res = np.vsplit(arr, 2)
# print(res)

# 把行的方向拆成 2部分 ---垂直拆分
# res = np.split(arr, 2, axis=0)
# print(res)

# 把列的方向拆成2部分---水平拆分
# res = np.split(arr, 2, axis=1)
# print(res)


# 可以不均匀拆分
# 把行的方向进行拆分
# ---这么拆:[:1] [1:3],[3:]
# ---[:开始值]
# ---[开始值:结束值]
# ---[结束值:]
# res = np.split(arr, [1, 3], axis=0)[0]
# print(res)
# print('*' * 100)
# res = np.split(arr, [1, 3], axis=0)[1]
# print(res)


# 前n列为一部分,最后一列为一部分
# 使用索引
# part_1 = arr[:, :-1]
# part_2 = arr[:, -1:]
# print('part_1:\n',part_1)
# print('part_2:\n',part_2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值