NumPy模块
1. NumPy多维数组
1.1 创建数组对象
(1)使用array函数创建数组对象
-
格式
np.array(obj, #接收array,表示想要创建的数组 dtype, # 接收data-type,表示数组所需要的数组类型,未给定则选择保存对象所需的最小类型 ndmin) # 接收int,指定生成数组应该具有的最小维数
-
创建ndarray数组
import numpy as np data = [1,3,5,7] # 可以是列表,元组,多维数组 w = np.array(data) # 输出 [1 3 5 7]
-
指定dtype
w = np.array([1,2,3,4],dtype = 'float64') print(w.dtype) # 输出float
(2)专门创建数组的函数
-
arange
函数主要用来创建数组
-
linspace
函数通过指定起始值,终值和元素个数创建一维数组(等差)
print(np.linspace(0,1,5)) # 输出[0. 0.25 0.5 0.75 1.]
-
logspace
函数创建等比数列
⚠️起始位和终值位代表的是10的幂,第三个参数表示元素的个数
-
zeros
函数构建全0矩阵
-
ones
函数构建全1矩阵
-
diag
函数构建对角矩阵,即对角线元素为0或指定值,其他元素均为0
-
eye
函数构建对角矩阵,对角线位置为1,其他位置全为0
1.2 ndarray对象属性和数据转换
属性 | 说明 |
---|---|
ndim | 数据轴的个数 |
shape | 数组的维度 |
size | 数组元素个数 |
dtype | 数据类型 |
itemsize | 数组中每个元素的字节大小 |
对于已经创建好的数组,可以通过astype方法进行数据类型的转换
1.3 生成随机数
- 常用随机数生成函数
函数 | 说明 |
---|---|
seed | 使每次生成的随机数都是一样的 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围 |
shuffle | 对一个序列进行随机排序 |
binomial | 产生二项分布的随机数 |
normal | 产生正态分布的随机数 |
beta | 产生beta分布的随机数 |
chisquare | 产生卡方分布的随机数 |
gamma | 产生gamma分布的随机数 |
uniform | 产生[0, 1)中均匀分布的随机数 |
1.4 数组变换
(1)数组重塑
reshape
- 通过
reshape
方法改变数组维度 reshape
中的一个参数可以设置为-1
,表示数组维度可以根据本身来推断
ravel/flatten
数据散开或数据扁平化(使数据降维)
(2)数组合并
- 横向合并:
hstack
函数
将ndarray对象构成的元组作为参数
- 纵向合并:
vstack
函数 concatenate
函数axis
= 1 横向合并axis
= 0 纵向合并
(3)数组分割
-
hsplit
:横向分割 -
vsplit
:纵向分隔 -
split
axis
= 1 横向分割axis
= 0 纵向分割
(4)数组转置和轴对换
- 数组使用
transpose
转置 T
属性转置swapaxes
实现轴对换
1.5 数组与标量之间的运算
"""数组元素的追加"""
a = [1, 2, 3]
b = []
for i in a:
b.append(i*i)
print('b数组:',b) # b数组:[1, 4, 9]
wy = np.array([1,2,3])
c = wy * 2
print('c数组:',c) # c数组:[2 4 6]
1.6 ufunc函数
ufunc函数全称为通用函数,是一种能够对数组中的所有元素进行操作的函数
(1)常用的ufunc函数运算
-
四则运算
-
比较运算
最终返回布尔值
-
逻辑运算
np.any函数表示逻辑“or”;np.all函数表示逻辑"and",运算结果返回布尔值
(2)ufunc函数的广播机制
广播是指不同形状的数组之间执行算数运算的方式。广播机制需要遵循4个原则:
(1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1
补齐
数组 C:形状是 (2, 3)
数组 D:形状是 (5, 3, 4)
# 补齐之后
数组 C 的形状是 (1, 2, 3)
数组 D 的形状是 (5, 3, 4)
(2)输出数组的shape是输入数组shape的各个轴上的最大值
数组 A,形状是 (3, 4)
数组 B,形状是 (2, 5)
输出数组的形状是 (3, 5)
(3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1
时,这个数组能够用来计算,否则出错
"""长度为1"""
import numpy as np
A = np.zeros((1, 3, 4))
B = np.ones((2, 3, 4))
# 可以进行操作
C = A + B
print(C.shape) # 输出: (2, 3, 4)
形状为(2,3,4)
B = np.array([[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
[[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]])
(4)当输入数组的某个轴长度为1时,沿着此轴运算时都用此轴上的第一组值
import numpy as np
A = np.array([[1, 2, 3]]) # 形状 (1, 3) 使用A[0]
B = np.array([4, 5, 6]) # 形状 (3,)
C = A + B # 广播并进行加法运算
print("C = ", C) # 输出 C = [[5 7 9]]
1.7 条件逻辑运算
(1)基础
arr1 = np.array([1,3,5,7])
arr2 = np.array([2,4,6,8])
cond = np.array([True,False,True,False])
result = [(x if c else y)for x,y,c in zip(arr1,arr2,cond)]
print(result) # 输出[1, 4, 5, 8]
(2)where
方法
np.where(condition, x, y)
# 如果满足条件输出x,不满足条件输出y
np.where([[True,False],[True,True]],[[1,2],[3,4],[9,8],[7,6]])
# 输出array([[1,8],[3,4]])
- 当
where
中仅有condition
参数时,则输出满足条件元素的坐标,坐标通常以tuple
类型给出
w = np.array([2,5,6,3,10])
np.where(w > 4)
# 输出 (array([1, 2, 4],dtype = int64),)
2. 数组读写
ny.load("文件名.npy")
:从二进制文件中读取数据ny.save("文件名[.npy]",arr)
:以二进制的格式保存数据np.savez("文件名[.npy]",arr1,arr2,arr3)
:多个数组保存np.loadtxt("文件名",delimiter=",")
:把文件加载到一个二维数组中np.savetxt("文件名",arr,fmt = "%d",delimiter=",")
:将数组写到某种分隔符隔开的文本文件中np.genfromtxt("文件名",delimiter=",")
:结构化数字和缺失数据
import numpy as np
# 1. np.save 以二进制的格式保存数据
# 创建一个示例数组
arr = np.array([1, 2, 3, 4, 5])
# 保存数组到二进制文件
np.save('single_array.npy', arr)
print("数组已保存到 single_array.npy")
# 2. np.load 从二进制文件中读取数据
# 从二进制文件中加载数组
loaded_arr = np.load('single_array.npy')
print("从 single_array.npy 加载的数组:", loaded_arr)
# 3. np.savez 多个数组保存
# 创建多个示例数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr3 = np.array([7, 8, 9])
# 保存多个数组到一个二进制文件
np.savez('multiple_arrays.npz', arr1=arr1, arr2=arr2, arr3=arr3)
print("多个数组已保存到 multiple_arrays.npz")
# 加载多个数组
loaded_data = np.load('multiple_arrays.npz')
print("从 multiple_arrays.npz 加载的数组1:", loaded_data['arr1'])
print("从 multiple_arrays.npz 加载的数组2:", loaded_data['arr2'])
print("从 multiple_arrays.npz 加载的数组3:", loaded_data['arr3'])
# 4. np.savetxt 将数组写到某种分隔符隔开的文本文件中
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 将数组保存为以逗号分隔的文本文件
np.savetxt('array_text.txt', arr_2d, fmt='%d', delimiter=',')
print("二维数组已保存到 array_text.txt")
# 5. np.loadtxt 把文件加载到一个二维数组中
# 从文本文件中加载数组
loaded_2d_arr = np.loadtxt('array_text.txt', delimiter=',')
print("从 array_text.txt 加载的二维数组:")
print(loaded_2d_arr)
# 6. np.genfromtxt 结构化数字和缺失数据
# 创建包含缺失值的示例数据
data = """1,2,3
4,,6
7,8,9"""
with open('data_with_missing.txt', 'w') as f:
f.write(data)
# 从包含缺失值的文本文件中加载数据
loaded_missing_data = np.genfromtxt('data_with_missing.txt', delimiter=',')
print("从 data_with_missing.txt 加载的包含缺失值的数据:")
print(loaded_missing_data)
3. 统计分析
(1)排序
-
使用
sort
函数进行排序axis = 1
横向排序axis = 0
纵向排序
-
在给定一个或多个键时,得到一个由整数构成的索引数组,使用
argsort
和lexsort
函数argsort
:返回值为数组排序后的下标排列
arr = np.array([7,9,5,2,9,4,3,1,4,3]) print('原数组:',arr) # [7,9,5,2,9,4,3,1,4,3] print('排序后:',arr.argsort()) # [7,3,6,9,5,8,2,0,1,4]
lexsort
:是从最后一个关键字排序(元组形式),最终得到的是索引
import numpy as np names = np.array(['Tom', 'Jerry', 'Bob', 'Tom']) scores = np.array([88, 92, 75, 85]) # 先按名字升序,再按成绩升序 indices = np.lexsort((scores, names)) print(indices) # 输出排序后索引 [2 1 3 0] print(names[indices]) # 排序后的名字 ['Bob' 'Jerry' 'Tom' 'Tom'] print(scores[indices]) # 对应的成绩 [75 92 85 88]
(2)重复数据与去重
去重
unique
import numpy as np
my_array = np.array([1, 2, 3, 2, 4, 1, 5])
# 去重
unique_array = np.unique(my_array)
print(unique_array) # [1 2 3 4 5]
重复
tile
基本格式:numpy.tile(A, reps) # reps 重复的次数
import numpy as np
A = np.array([1, 2, 3])
# 沿一维方向重复 3 次
result = np.tile(A, 3)
print(result) # [1 2 3 1 2 3 1 2 3]
repeat
基本格式:numpy.repeat(a,reps,axis = None)
axis = 0 按行进行元素重复
axis = 1 按列进行元素重复
"""按行重复"""
import numpy as np
# 原始数组
a = np.array([[1, 2], [3, 4]])
# 沿第一个维度(行)重复 2 次
result = np.repeat(a, 2, axis=0)
print(result) # [[1 2]
# [1 2]
# [3 4]
# [3 4]]
"""按列重复"""
import numpy as np
# 原始数组
a = np.array([[1, 2], [3, 4]])
# 沿第二个维度(列)重复 2 次
result = np.repeat(a, 2, axis=1)
print(result) # [[1 1 2 2]
# [3 3 4 4]]