numpy库的基础知识(二)
一.数据的降维
1.改变数组的形状
import numpy as np
list=[1,2,3,4,5,6,7,8]
v=np.array(list)
v=v.reshape(2,2,2)
print(v)
ndarray.reshape()可以在不改变数组大小的情况下改变数组的形状。
可以用 reshape
来改变它的形状,如上面的reshape(2,2,2)
也可以用 np.reshape() 函数,这样可以额外传入几个可选参数:
import numpy as np
a=[1,2,3,4,5,6,7,8]
b=np.reshape(a, newshape=(2, 4), order='C')
print(b)
a 是原数组
newshape 是新形状,要和原来的形状适配
order 是方法,主要有 3 种,C 方式是行主序,F (Fortran)方式是列主序,A 是自动根据内存分配方式
行主序:在内存中按照一行一行连续存储,因此元素分配从前往后是 (0,0) , (0,1) , (0,2) ,(1,0),(1,1),(1,2) 列主序:在内存中按照一列一列连续存储,因此元素分配从前往后是 (0,0) , (1,0) , (0,1) ,(1,1),(0,2),(1,2)
import numpy as np
a=[1,2,3,4,5,6,7,8]
b=np.array(a)
c=b.reshape(2,2,2)
print(c.ravel())
reval()将高维数组转化为1维
ravel方法(如果可能)返回的是原始数组的视图,因此对返回的一维数组所做的修改可能会影响原始的多维数组。
import numpy as np
a=[1,2,3,4,5,6,7,8]
b=np.array(a)
c=b.flatten()
print(c)#[1 2 3 4 5 6 7 8]
flatten方法返回的是原数组的副本,这意味着对返回的一维数组所做的任何修改都不会影响原始的多维数组。
2.创建元素全是 0 的数组
import numpy as np
a=np.zeros((2,2))
print(a)
3.创建元素全是 1 的数组
import numpy as np
a=np.ones((2,2,2))
print(a)
4.创建全为5的数组,矩阵中全部填充指定的数据
import numpy as np
g= np.full((2,2,2),5)
print(g)
5.创建主对角线全为1的数组
import numpy as np
a= np.eye(5,5)
print(a)
6.可以指定范围和步长
import numpy as np
a= np.arange(2, 9, 2)
print(a)#[2 4 6 8]
7.几个间相等的元素
import numpy as np
a= np.linspace(0, 10, num = 5)
print(a)#[ 0. , 2.5, 5. , 7.5, 10. ])0(包含) 到 10(包含) 之间 5 个间隔相同的元素
二.增、删、排序
1.数组排序的主要函数是 np.sort() , 你可以指定排序的轴 (axis)、方法(kind)、升逆序(order)等。
import numpy as np
arr = np.array([2, 1, 5, 3, 7, 4, 6, 8])
a=np.sort(arr)
print(a)#[1 2 3 4 5 6 7 8]
2.也可以在第一维度上把他们连接起来
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c=np.concatenate((a, b), axis=0)
print(c)#[1 2 3 4 5 6 7 8]
axis=0表示横向连接
axis=1表示纵向连接
3.添加新轴
可以用 np.newaxis , np.expand_dims 来拓展已有数组的维度,n 维数组加上一根新轴变成
n+1维数组
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
a2 = a[np.newaxis, :]
print(a2)#[[1 2 3 4 5 6]]
也可以用 np.expand_dims 来指定新维度的插入位置
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b=np.expand_dims(a, axis=1)
print(b)
三. 数组操作与索引
1.索引与切片
import numpy as np
arr = np.arange(36).reshape(6, 6)
print(arr)
# 基本索引
print(arr[2, 3]) # 第2行第3列元素
print(arr[1:3, 2:5]) # 第1-2行,第2-4列的子数组
print(arr[:, ::2]) # 所有行,每隔一列# 高级索引
bool_idx = arr > 30 # 布尔索引
print(arr[bool_idx])fancy_idx = arr[[0, 2, 4], [1, 3, 5]] # 花式索引
print(fancy_idx)
2.形状操作
import numpy as np
orig_arr = np.arange(12)# 重塑形状 - 不改变数据
reshaped = orig_arr.reshape(3, 4)
print(reshaped)# 调整大小 - 可能改变原数组
a=orig_arr.resize((4, 3))
print(a)# 展平数组
flattened = reshaped.flatten() # 返回副本
raveled = reshaped.ravel() # 返回视图
print(flattened)
print(raveled)# 维度变换
transposed = reshaped.T # 转置
swap_arr = np.swapaxes(reshaped, 0, 1) # 交换轴
print(transposed)
print(swap_arr)
3.数组组合
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])# 垂直堆叠
v_stack = np.vstack((a, b)) # 或 np.concatenate((a, b), axis=0)# 水平堆叠
h_stack = np.hstack((a, b.T)) # 或 np.concatenate((a, b.T), axis=1)# 深度堆叠
d_stack = np.dstack((a, a)) # 沿第三维堆叠# 分割数组
sub_arrays = np.split(v_stack, [2, 3]) # 在指定位置分割
四.数学运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])# 基本运算
print(a + b) # 加法
print(a * b) # 乘法(逐元素)
print(a @ b) # 点积(向量)
print(a ** 2) # 平方# 通用函数(ufunc)
print(np.sin(a)) # 正弦函数
print(np.exp(b)) # 指数函数
print(np.log(a)) # 自然对数
print(np.modf(b)) # 小数和整数部分分离
线性代数操作:
from numpy import linalg as LAmat = np.array([[1, 2], [3, 4]])# 矩阵求逆
inv_mat = LA.inv(mat) # 行列式
det = LA.det(mat)
五.numpy高级运用
import numpy as np
# 定义结构化数据类型
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]# 创建结构化数组
people = np.array([('Alice', 28, 1.68),('Bob', 35, 1.82),('Carol', 24, 1.73)
], dtype=dtype)# 字段访问
print(people['name']) # 所有名字
print(people[people['age'] > 30]) # 筛选年龄>30的记录