数据大清洗_Numpy进阶(数组运算)(读写文件)

本文深入探讨了NumPy库中数组的通用函数运算,包括四则运算、比较运算和逻辑运算,以及数组的广播机制。同时,介绍了二进制和文本格式下数组的保存与读取方法,包括save、load、savez、savetxt和loadtxt等函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数组的运算

# 数组的全通用函数 ---是一种能够对数组中所有元素进行操作的函数--以整个数组为输出
# 要求:运算的数组 ---必须是同型
import numpy as np

# 创建两个数组
# arr1 = np.array([[1, 2], [2, 1]])  # (2,2)
# arr2 = np.arange(1, 5).reshape((2, 2))  # (2,2)
# print('arr1:\n', arr1)
# print('arr2:\n', arr2)
# print('*' * 100)
# (1) 四则运算 --- + - * / ** ---->对应位置运算进行对应的四则元素--以整个数组为一个运算单位
# print('arr1 + arr2:\n', arr1 + arr2)  # 对应位置元素相加
# print('arr1 - arr2 :\n', arr1 - arr2)  # 对应位置元素相减
# print('arr1 * arr2 :\n', arr1 * arr2)  # 对应位置元素相乘
# print('arr1 / arr2 :\n', arr1 / arr2)  # 对应位置元素相除---注意:除数不能为0
# print('arr1 ** arr2:\n', arr1 ** arr2)  # 对应位置元素求幂

# (2) 比较运算 --- > < >= <= == !=  ---->返回bool数组
# 对应位置元素进行比较,如果满足比较的条件,返回True 否则为False --->返回bool数组
# print('arr1 == arr2 :\n', arr1 == arr2)
# print('arr1 <= arr2:\n', arr1 <= arr2)
# print('arr1 > arr2 :\n', arr1 > arr2)
# print('*' * 100)

# (3) 逻辑运算 ---返回bool值
# np.all  相当于and --只有都满足的条件的时候,才返回True,只要有一个不满足,结果即为False
# np.any  相当于or --只要有一个满足条件,就返回True,全部都不满足条件,则结果为False
# print('all:\n', np.all(arr1 == arr2))
# print('all:\n', np.all(arr1 <= arr2))
# print('any:\n', np.any(arr1 == arr2))
# print('any:\n', np.any(arr1 > arr2))

# # 先比较---然后利用比较运算返回的bool数组进行索引操作
# # 创建一个数组---身高的数组
# height = np.array([170, 175, 178, 180, 172])
# # 找到偶数的身高 ---bool数组
# bool_mask = height % 2 == 0
# print(bool_mask)
#
# # 筛选出具体的偶数的身高
# new_height = height[bool_mask]
# print(new_height)

# 创建两个数组
arr1 = np.arange(6).reshape((2, 3))  # (2,3)-->shape的长度为2
arr2 = np.array([2, 1, 3])  # (3,) --->shape的长度为1 ---> arr2向arr1看齐 --->(1,3)
arr3 = np.array([[1, 2], [2, 1]])  # (2,2)
print('arr1:\n', arr1)
print('arr2:\n', arr2)
print('arr3:\n', arr3)

# 数组的广播机制 --- 不同型的数组的算术运算规则
print('arr1 + arr2 :\n', arr1 + arr2)
# print('arr1 + arr3 :\n', arr1 + arr3)  # 不能运算

# arr1
#  [[0 1 2]
#  [3 4 5]]

# arr2
#  [2 1 3] --->(1,3)  --->[[2 1 3]] -->行维度为1 ---沿着行维度的计算,---都使用第0行数据

# (4) ---两个数组进行运算--如果有维度为1,沿着此轴上的运算都用第一组值

# 根据(4) --->arr2
# [[2 1 3]
# [2 1 3]]

#  [[0 1 2]  +  [[2 1 3]
#  [3 4 5]]     [2 1 3]]

# --->[[2 2 5]
#      5 5 8 ]]
#      ---->输出(2,3)
# 输入(2,3)  (3,)-->(1,3) --->可以运算

# arr1  arr3 为什么不能运算?
# arr1 (2,3)  arr3(2,2)
# (2)规则---> 输出(2,3) --->(3)规则
# ---输出数组形状的列维度 与 arr3输入数组形状在列维度不相等且并没有一个为1的,所以不能运算

# 假设存在arr1 shape为(1,2,3,4,4,5,6)数组
# 存在arr2 shape为(1,2,4,4,1,1)数组--->(1,1,2,4,4,1,1)
# 这两个数组不能相加

二、读写文件

Numpy 文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式。

(一)二进制文件

save 函数是以二进制的格式保存数据。
load 函数是从二进制的文件中读取数据。
savez 函数可以将多个数组保存到一个文件中。

存储时可以省略扩展名,但读取时不能省略扩展名。

(二)读取文本格式的数据(TXT CSV 格式):

savetxt 函数是将数组写到某种分隔符隔开的文本文件中。
loadtxt 函数执行的是把文件加载到一个二维数组中。
genfromtxt 函数面向的是结构化数组和缺失数据。
import numpy as np

# 数组可以以二进制形式、文本形式进行保存

# 二进制形式---以0101的这种进行保存
# 创建一个数组进行保存
# arr = np.arange(16).reshape((4, 4))
# print(arr)
# 将单个数组以二进制形式进行保存
# 参数1 路径+ 名称,此时,文件后缀名可以省略,默认保存成以.npy为结尾二进制文件
# 参数2 需要保存的数组
# np.save('./arr',arr)
# print('保存成功')

# 加载.npy文件
# 参数 文件路径+名称,此时后缀名不能省略
# data = np.load('./arr.npy')
# print('加载的数据为:\n',data)

# 创建一个数组
# new_arr = np.array([1, 2, 3, 4, 5, 6])
# print('new_arr:\n', new_arr)

# 将多个数组以二进制的形式进行保存
# 参数1 :路径+名称,此时,文件后缀名可以省略,默认保存成以.npz为结尾二进制文件
# 参数 :需要保存的数组
# np.savez('./arr', arr, new_arr)
# print('保存成功')

# # 加载.npz文件
# res = np.load('./arr.npz')
# # print(res)  # <numpy.lib.npyio.NpzFile object at 0x00000000026FB240>
# # # 遍历
# for tmp in res:
#     print(tmp)  # arr_0  arr_1
# # 保存的数组的时候,以key:value这种映射关系进行保存的
# # arr_0:数组1   arr_1:数组2
# # 可以通过key来获取value
# x = res['arr_0']
# y = res['arr_1']
# print('x:\n', x)
# print('y:\n', y)

# 在保存多个数组的数组的时候,可以指定保存时映射关系的key来明确不同的key对应不同的数组
# 将多个数组指定key的方式保存为.npz
# np.savez('./arr_key', arr=arr, new_arr=new_arr)
# print('保存成功')

# 加载指定key的.npz文件
# res = np.load('./arr_key.npz')
# print(res)  # <numpy.lib.npyio.NpzFile object at 0x000000000211B240>
# # 以我们保存时指定的key来获取指定数组值
# x = res['arr']
# y = res['new_arr']
# print('x:\n', x)
# print('y:\n', y)
# 保存10-20...多个数组,指定key,另外说明文件,记录不同的key所对应数组的不同功能

# 文本形式---以人可以识别的有序的序列内容进行保存
# 创建数组
arr = np.arange(16).reshape((4, 4))
# print(arr)

# 以文本形式进行保存
# 参数1 文件路径+名称 .txt, .csv --->序列化的文本文件
# 参数2 需要保存的数组
# fmt ---保存的格式---默认以科学计数法来进行保存
# delimiter --分隔符,默认以空格分隔
# np.savetxt('./arr.txt', arr, fmt='%d', delimiter=',')
# print('保存成功')

# 加载保存的数组
# 参数1 路径+ 名称
# dtype :加载出来数组元素的类型
# delimiter: 分隔符,以哪种分隔符保存的,就以哪种分隔符进行读取
# 不可以加载含有缺失数据的数组
data1 = np.loadtxt('./arr.txt', dtype=int, delimiter=',')
print(data1)

# 可以读取含有缺失数据的数组内容的
data2 = np.genfromtxt('./arr.txt', dtype=int, delimiter=',')
print(data2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值