Python数据分析使用numpy:数组、矩阵基本用法

本文详细介绍了Python数据分析库numpy的使用,包括数组元素索引、数组展开、组合拆分、矩阵创建及运算、通用函数、广播机制、数组的保存与读取、排序、去重和重复等核心概念,是进行数据处理的基础操作指南。

1、数组元素索引

import  numpy as np
arr = np.arange(16).reshape((4,4))
#获取 0 2 行的 前两列
data = arr[[0,2],0:2:1]
data = arr[[0,2],[0,1,2]]  # 错误的,如果这样取值,前后的形状必须一致

# arr_mask = np.array([0,1,0,3],dtype=np.bool)
# # 利用bool数组进行切片
# data = arr[arr_mask,:] #第0行不见了
# # data = arr[:,arr_mask] # 第0列不见了

#总结:
"""
一维  arr[下标/切片]
二维  arr[行下边或者切片,列下标或者切片] 
三维  arr[块下标或者切片,行,列]
四维  arr[堆下标或者切片,块,行,列]
"""
# 注意:
#  如果使用下标,会降维度,如果使用切片,维度不变
# bool数组进行索引的时候,需要索引的是二维数组,那么你的bool数组是一维的,
# bool数组的长度 需要与你要切的维度的长度一致

2、数组展开

import  numpy as np
# 创建一个二维数组
arr = np.mat(np.arange(16).reshape((4,4)))
print("arr;\n",arr)

# 进行数组展开
# ravel() --进行将高维度数组 展开为一维,按行展开
# print(arr.ravel())
# flatten() -进行将高维度数组 展开为一维,按行展开---默认为C风格
# print(arr.flatten(order = "C"))
# 按列展开
# print(arr.flatten(order = "F"))
# print(arr)

# ravel 与C 风格flatten一样 

3、数组的组合

import  numpy as np
# 创建一个二维数组
arr_2 = np.arange(4,8).reshape([2,2])
arr_3 = np.array([[1,2]]) # (1,2)
print("arr2:\n",arr_2)

# 数组组合 ---参数 需要是一个对象---元组对象、或者列表对象
# new_arr = np.vstack((arr_1,arr_2)) #按照行的方向进行拼接
# new_arr = np.hstack([arr_1,arr_2]) #按照列的方向进行拼接
# new_arr = np.concatenate((arr_1,arr_3),axis=0) # (行,列) ---和vstack一样
# new_arr = np.concatenate((arr_1,arr_2),axis=1) # (行,列) ----和hstack 一样
# print("new_arr:\n",new_arr)

# 注意  : 拼接的时候维度必须一致
# 在行的方向进行拼接,你必须保证列数一致
#  在列的方向上进行拼接,必须保证行数一致

4、数组的拆分

import  numpy as np
# 创建一个二维数组
arr = np.arange(16).reshape((4,4))
print("arr:\n",arr)

# 拆分 ----平均拆分,必须能整除,否则报错
new_arr = np.hsplit(arr,4)  # 在列的方向上进行分割数组
print("new_arr:\n",new_arr)
# print("new_arr:\n",type(new_arr[0]))

# new_arr = np.vsplit(arr,4)  # 在行的方向上进行分割数组
# print("new_arr:\n",new_arr)
# print("new_arr:\n",type(new_arr[0]))

# new_arr = np.split(arr,4,axis=0)  # 在行的方向上进行分割数组
# new_arr = np.split(arr,4,axis=1)  # 在列的方向上进行分割数组
# print("new_arr:\n",new_arr)
# print("new_arr:\n",type(new_arr[0]))

5、矩阵创建

import  numpy as np
# 创建矩阵 ---必须是二维的
# mat
# m1 = np.mat("1 2 3;4 5 6;7 8 9")
# m1 = np.mat([[1,2,3],[4,5,6],[7,8,9]]) # 可以将列表转化为矩阵
# m1 = np.mat(np.array([[[1,2,3],[4,5,6]]])) # 可以将数组转化为矩阵

# m1 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
# m1 = np.matrix(np.array([[[1,2,3],[4,5,6]]]))
# m1 = np.asmatrix(np.array([[[1,2,3],[4,5,6]]]))
# print("m1:\n",m1)
# print("m1 的类型:\n",type(m1))
# 推荐使用mat 或者 asmatrix

# bmat 进行堆积组合矩阵
# arr1 = np.mat(np.arange(4).reshape((2,2)))
arr1 = list(np.arange(4).reshape((2,2)))
print("arr1:\n",arr1)
print("arr1的类型:\n",type(arr1))
# arr2 = np.mat(np.arange(4,8).reshape((2,2)))
arr2 = list(np.arange(4,8).reshape((2,2)))
print("arr2:\n",arr2)
print("arr2的类型:\n",type(arr2))

m2 = np.bmat([[arr1,arr2],[arr2,arr1]])
print("m2:\n",m2)
print("m2 的类型:\n",type(m2))

6、矩阵运算

import  numpy as np

# 创建一个矩阵
# m1 = np.arange(4).reshape((2,2))
# print("m1:\n",m1)
# print("m1 的类型:\n",type(m1))

# 矩阵与数的相乘--与矩阵的每一个元素相乘
# m2 = 3 * m1
# print("m2:\n",m2)

# 矩阵相加--同形矩阵---对应位置元素进行相加减
# m3 = np.mat(np.arange(1,5).reshape((2,2)))
# print("m3:\n",m3)
# m4 = m1 + m3
# # m5 = m1 - m3 #  m1 + (-m3)
# m5 =  m1 + (-m3)
# print("m4 :\n",m4)
# print("m5 :\n",m5)

m1 = np.mat(np.arange(4).reshape((2,2)))
print("m1:\n",m1)
print("m1 的类型:\n",type(m1))
# 矩阵相乘----左矩阵列数 等于右矩阵行数 才能进行相乘,生成左矩阵行数、右矩阵列数形状的矩阵
# m6 = np.mat(np.arange(1,5).reshape((2,2)))
# print("m6:\n",m6)
# print("m6 的类型:\n",type(m6))

# 进行矩阵相乘
# res = m1 * m6 # (2,2)  * (2,3)
# res = m6 * m1 # 错误的 ,不满足公式(2,3) * (2,2)

#推荐使用下面这两种 -在某些 情况下 matmul 会比dot 严格一点
# res = np.matmul(m1,m6)
# res = np.dot(m1,m6)
# print("res:\n",res)
# print("res 的类型;\n",type(res))


# 矩阵对应元素相乘---需要满足广播机制 ----数组的广播机制
# res = np.multiply(m1,m6) # 必须同形
# print("res:\n",res)
# print("res 的类型;\n",type(res))

print("矩阵的转置:\n",m1.T)
print("矩阵的逆:\n",m1.I) # A * A.I = E
print("矩阵的共轭转置:\n",m1.H) # 先共轭 在转置 ---》转置
print("矩阵的视图:\n",m1.A)
print("矩阵的视图的类型:\n",type(m1.A))

print(np.matmul(m1,m1.I)) # 等于单位矩阵

7、数组的通用函数

import numpy as np

# 创建数组 ----数组间的运算
arr1 = np.arange(4).reshape((2, 2))
# arr2 = np.arange(4, 8).reshape((2, 2))
arr2 = np.array([[0,1],[4,5]])

print("arr1\n", arr1)
print("arr2\n", arr2)
# 四则运算----必须是同形数组,而且四则运算是对对应位置元素的运算
# print("数组相加:\n",arr1+ arr2) # 对应元素相加
# print("数组相减:\n",arr1- arr2) # 对应元素相减
# print("数组相乘:\n",arr1 * arr2) # 对应元素相乘
# print("数组相除:\n",arr1 / arr2) # 对应元素相除  ---不会报错,但是会出警告,尽量不要让分母出现0
# print("数组求幂:\n",arr2 ** arr1) # 对应元素求幂

# 比较运算---返回同形的同维度的bool数组
# print("arr1 > arr2:\n", arr1 > arr2)
# print("arr1 < arr2:\n", arr1 < arr2)
# print("arr1 <= arr2:\n", arr1 <= arr2)
# print("arr1 >= arr2:\n", arr1 >= arr2)
# print("arr1 == arr2:\n", arr1 == arr2)
# print("arr1 != arr2:\n", arr1 != arr2)

# 逻辑运算
# any 相当于 or
# print(np.any(arr1 == arr2))
# print(np.any(arr1 != arr2))

# all 相当于 and 必须所有条件都满足,才为True,其它为False
# print(np.all(arr1 != arr2))

8、数组广播机制


import  numpy as np

# 创建一个二维数组
arr1 = np.arange(4).reshape((2,2))
print("arr1:\n",arr1)
print("arr1 的形状:\n",arr1.shape) # (2,2)

arr2 = np.array([1,2])
arr3 = np.array([[1,2],[1,2],[1,2]])
print("arr2:\n",arr2)
print("arr2 的形状:\n",arr2.shape) # (2,)--->(1,2) # (3,2)

print("arr1 + arr2 :\n",arr1 + arr3)


# 问题  数组1 shape =(2,3,4,5,6,7,8)
# 数组2 shape = (1,7,8)  数组1和数组2 可以算术计算

# 数组3  shape=(7,8,9,4,2)
# 数组4 shape = (7,2,1,4,2) 数组3 和数组4不能进行算术计算

9、数组保存与读取

import  numpy as np

# 创建一个数组
arr1 = np.arange(16).reshape((4,4))
print("arr1 :\n",arr1)
#
# arr2 = np.array([1,2,3,4])
# print("arr2:\n",arr2)

#save 以二进制形式来保存数组---保存的文件是以.npy为结尾的二进制文件
# 参数1  保存的文件路径+ 文件名称,可以省略文件名后缀
# 参数2  需要保存的数组
# np.save("./arr",arr)
# print("保存完成")

# 读取.npy 文件
# 读取的时候必须指定后缀名
# arr = np.load("./arr.npy")
# print("加载完成")
# print("arr :\n",arr)

# 通过savez 来保存多个数组---默认保存的是以.npz为结尾的二进制文件
# 参数1 是保存的路径+ 名称,后缀名可以省略
# np.savez("./arr",arr1,arr2)
# print("保存完成")

# 加载数组
# data = np.load("./arr.npz") # data 是以键值对形式存储的
# print(data)
# for tmp in data:
#     print(tmp) # 键名
#     print(data[tmp]) # 可以通过字典的取值形式来获取 数组

# 文本形式的保存

np.savetxt("./arr.csv",arr1,fmt="%d",delimiter=',')
print("保存完成")

# 加载文本形式的数组
# data = np.loadtxt("./arr.txt",dtype=int,delimiter=' ')
# print("加载完成")
# print(data)

# 可以读取结构化数组和缺失数据
# filling_values  指定你缺失的时候填充的数据
# data = np.genfromtxt("./arr.txt",dtype=int,delimiter=' ',filling_values='-1')
# print("加载完成")
# print(data)

10、数组的排序

import  numpy as  np

# 创建一个数组
# arr = np.array([[9,10,8,3],[2,1,6,4]])
# arr = np.array([9,10,8,3,2,1,6,4])

# 默认按照最后一个维度进行排序,可以进行设置axis
# arr.sort() # 升序排序,而且会对原数组产生影响
# print("排序结果:\n",arr)

# argsort  返回的是排序之后元素在原来位置的索引
# res = arr.argsort()
# print(res)

# lexsort() ---按照最后一个数组的规则来给自己排序
x = np.array([1,2,3,4,5])
y = np.array([2,1,0,3,5])
z = np.array([10,8,11,7,12])

print("hhh:\n",np.argsort(z))

res = np.lexsort([x,y,z]) # 返回的是最后一个的排序之后原来数组的索引
print(res)

# 以列表推导式的形式来获取x 按照z 排序规则进行排序之后的结果
a = [x[i] for  i in res]
print(a)


11、数组的去重和重复

import  numpy as np


# 创建一个数组
# arr = np.array([1,2,3,3,2,1,12,3,4,5,6])
arr = np.arange(4).reshape((2,2))



# 对数组进行去重
# unique  去重+ 排序 (仅支持英文与数字)
# res = np.unique(arr)
# print(res)

# 重复数据 tile作为整体进行重复N次
# res = np.tile(arr,2)
# print(res)

# 按列进行重复N次
# res = np.repeat(arr,2,axis=1)
res = np.repeat(arr,2,axis=0)
print(res)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值