NumPy 是 Python 中用于科学计算的基础库之一,它提供了强大的多维数组对象 ndarray,以及丰富的数学函数库。本文将介绍如何创建、操作和处理 ndarray,并总结常用的 NumPy 功能。
创建 ndarray
从列表创建 ndarray
使用 np.array 函数可以将 Python 列表转换为 NumPy 数组。
import numpy as np
my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)
查看 ndarray 的属性
你可以使用以下属性来查看 NumPy 数组的详细信息:
print("元素类型 dtype:", my_arr.dtype) # 数据类型
print("维度数 ndim:", my_arr.ndim) # 数组的维度数
print("数组大小 size:", my_arr.size) # 数组中元素的总数
print("各维度大小 shape:", my_arr.shape) # 数组的形状(各维度的大小)
print("元素占用的存储空间 itemsize:", my_arr.itemsize) # 每个元素占用的字节数
创建二维 ndarray
你可以创建多维数组,例如二维数组:
my_arr_2d = np.array([[1, 2], [3, 4]])
修改维度
使用 reshape 方法可以生成一个新的数组,改变其形状。使用 shape 属性可以直接修改原数组的形状。
# 生成新的数组
reshaped_arr = my_arr.reshape(2, 3)
# 改变原数组
my_arr.shape = (2, 3)
复原和拍平
使用 ravel 方法可以将数组复原为一维数组。使用 flatten 方法可以将多维数组拍平为一维数组。
# 复原
flattened_arr = my_arr.ravel()
# 拍平
flattened_arr = my_arr.flatten()
组合和拆分
使用 vstack 和 hstack 方法可以将多个数组组合在一起。使用 hsplit 和 vsplit 方法可以将数组拆分。
# 组合
vstacked_arr = np.vstack((my_arr_2d, my_arr_2d))
hstacked_arr = np.hstack((my_arr_2d, my_arr_2d))
# 拆分
hsplit_arr = np.hsplit(my_arr_2d, 2)
vsplit_arr = np.vsplit(my_arr_2d, 2)
创建函数
NumPy 提供了多种创建数组的函数:
# arange
arr = np.arange(0, 12, 3) # [0 3 6 9]
# linspace
arr = np.linspace(0, 10, 5) # [ 0. 2.5 5. 7.5 10. ]
# zeros
arr = np.zeros(6) # [0. 0. 0. 0. 0. 0.]
# ones
arr = np.ones(6) # [1. 1. 1. 1. 1. 1.]
# random
arr = np.random.random(3) # [0.68390055 0.50917134 0.91393462]
运算
广播
广播机制允许 NumPy 在不同形状的数组之间进行算术运算。
arr = np.array([1, 2])
result = arr * 6 # [6, 12]
一维数组运算
NumPy 支持对一维数组进行各种算术运算。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
result = arr1 + arr2 # [5, 7, 9]
二维数组运算
NumPy 支持对二维数组进行各种算术运算。
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
result = A + B # [[ 6 8]
# [10 12]]
# 点乘
result = np.dot(A, B)
常用函数
NumPy 提供了许多常用的数学函数:
arr = np.array([1, 2, 3, 4])
# 各值的平方根
sqrt_arr = np.sqrt(arr)
# 各元素以 e 为底的对数
log_arr = np.log(arr)
# 各元素正弦值
sin_arr = np.sin(arr)
# 各个元素的和
sum_arr = np.sum(arr)
# 最小值、最大值、平均值、标准差
min_val = np.min(arr)
max_val = np.max(arr)
mean_val = np.mean(arr)
std_val = np.std(arr)
# 各个元素的累计和
cumsum_arr = np.cumsum(arr) # [ 1 3 6 10]
# 各个元素的累计积
cumprod_arr = np.cumprod(arr)
索引和切片
NumPy 数组支持多种索引和切片操作:
arr = np.array([0.1, 0.99, 2.5, 3.7])
# 索引
print(arr[1]) # 0.99
print(arr[[1, 2]]) # [0.99 2.5]
# 布尔索引
print(arr[arr < 1]) # [0.1 0.99]
# 切片
print(arr[1:3]) # [0.99 2.5]
print(arr[::2]) # [0.1 2.5]
读写
NumPy 提供了方便的读写数组的方法:
# 写
np.save('my_arr', my_arr)
# 读
loaded_arr = np.load('my_arr.npy')
# 写入多个数组
np.savez('array_archive.npz', my_arr1=my_arr, my_arr2=my_arr_2d)
# 压缩写入
np.savez_compressed('arrays_compressed.npz', my_arr1=my_arr, my_arr2=my_arr_2d)
复制
NumPy 提供了多种复制数组的方法:
# 直接赋值,存的相同地址
A = B
# 视图
A = B.view()
# 拷贝
A = B.copy()
总结
本文介绍了 NumPy 中 ndarray 的基础知识,包括创建、运算、常用函数、索引和切片、读写和复制等内容。通过这些操作,你可以高效地处理多维数组数据,进行科学计算和数据分析。希望这篇文章对你有所帮助!
原稿备注
创建
import numpy as np
my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)
元素类型 dtype my_arr.dtype
维度数 ndim my_arr.ndim
数组大小 size my_arr.size
各维度大小 shape my_arr.shape
元素占用的存储空间 itemsize
二维:
修改维度 reshape my_arr.reshape(2,2)//生成新的 arr.shape(2,2)//改原数组
复原 ravel 使用arr.shape修改的数组可以用revel复原
二维数组拍平 flatten和nditer my_arr.flatten() np.nditer(my_arr, order='C') C行优先 F列优先
组合 row_stack/vstack竖向组合,列数相等 column_stack/hstack横向组合,行数相等
拆分 np.hsplit(arr,2)竖向拆分 np.vsplit(arr,2)横向拆分 np.split(arr,[起始,结束,跨度],axis=1)
创建函数:
arange np.atange(0,12,3) //[0 3 6 9] ,(起始值,结束值(不包含),步长)
linspace np.linspace(0, 10, 5) //[ 0. 2.5 5. 7.5 10. ],(起始值,结束值(包含),分割数)
zeros np.zeros(6) //[0. 0. 0. 0. 0. 0.],填充0
np.ones(6) //[1. 1. 1. 1. 1. 1.]
np.random.random(3)//[0.68390055 0.50917134 0.91393462]
运算
广播: arr=[1,2] arr*6等于[6,12]
一维数组: arr1+arr2=[同位相加],- * % \ //都是这样
二维数组: 基础运算,同位,且维度相同
点成dot np.dot(A,B) A 的列数column === 矩阵 B 的行数row
函数
各值的平方根 sqrt np.sqrt(arr)
各元素以 e 为底的对数 log
各元素正弦值 sin
各个元素的和 sum
最小min 最大max 平均值mean 标准差std
各个元素的累计和 cumsum np.cumsum([1,2,3,4]) //[ 1 3 6 10]
各个元素的累计积 cumprod
二维数组:函数(arr,axis=index)//第二个参数是axis指定每列计算,得到一个一维数组
索引
arr[]
arr[[1,2]]多值索引
arr[1,2]二位数组索引
arr<1 [True False]返回布尔值
arr[arr<1] [0.1 0.99]区间索引 ,如果是二维数组会返回为符合条件的一维数组
切片
[起始下标:结束下标(不包含):跨度,二维数组的索引条件同上]
读写
写 np.save('my_arr1', my_arr1)
读 my_arr1 = np.load('my_arr1.npy')
写入多个 np.savez('array_archive.npz', my_arr1 = my_arr1, my_arr2 = my_arr2)
压缩写入 np.savez_compressed('arrays_compressed.npz', my_arr1 = my_arr1, my_arr2 = my_arr2)
复制
A=B 存的相同地址
A=B.view() A是B的视图 A.base is B ,A的形状发生改变时,B 的形状并不会发生改变。
但是,当 A 的数据发生改变时,B 会发生同样的改变。
A=B.copy() 拷贝