numpy 模块
NumPy说明
NumPy(Numerical Python)是 Python 科学计算的核心库。
NumPy 基础
安装与导入
# 安装
pip install numpy
# 标准导入方式
import numpy as np
print(f"NumPy 版本: {np.__version__}")
创建数组的 10 种方法
import numpy as np
# 1. 从 Python 列表创建
arr1 = np.array([1, 2, 3, 4, 5])
print(f"1. 从列表创建: {arr1}")
# 从列表创建: [1 2 3 4 5]
# 2. 从元组创建
arr2 = np.array((1.5, 2.5, 3.5))
print(f"2. 从元组创建: {arr2}")
# 从元组创建: [1.5 2.5 3.5]
# 3. 创建全零数组
zeros = np.zeros(5)
print(f"3. 全零数组: {zeros}")
# 全零数组: [0. 0. 0. 0. 0.]
# 4. 创建全一数组
ones = np.ones((3, 4)) # 3行4列
print(f"4. 全一数组:\n{ones}")
# [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]]
# 5. 创建单位矩阵
eye = np.eye(3) # 3×3单位矩阵
print(f"5. 单位矩阵:\n{eye}")
# [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
# 6. 创建等差数列
lin = np.linspace(0, 10, 5) # 从0到10,5个等间距点
print(f"6. 等差数列: {lin}")
# 等差数列: [ 0. 2.5 5. 7.5 10. ]
# 7. 创建等间隔数组
arange = np.arange(0, 10, 2) # 从0到10,步长为2
print(f"7. 等间隔数组: {arange}")
# 等间隔数组: [0 2 4 6 8]
# 8. 创建随机数组
rand = np.random.rand(3, 3) # 3×3的[0,1)均匀分布
print(f"8. 随机数组:\n{rand}")
# 随机数组: [[0.57980982 0.16965838 0.26229211] [0.44653552 0.17974408 0.43776795] [0.58904302 0.60921252 0.01472058]]
# 9. 创建空数组(未初始化,值随机)
empty = np.empty((2, 3))
print(f"9. 空数组:\n{empty}")
# 空数组: [[6.93704801e-310 0.00000000e+000 6.93772010e-310] [1.98483372e-263 2.93192686e-315 4.23406404e-307]]
# 10. 创建全值数组
full = np.full((2, 2), 7) # 2×2全为7
print(f"10. 全值数组:\n{full}")
# 全值数组: [[7 7] [7 7]]
# 11. 从字符串创建
arr_str = np.array('1 2 3 4 5'.split(), dtype=int)
print(f"11. 从字符串创建: {arr_str}")
# 从字符串创建: [1 2 3 4 5]
# 12. 从函数创建
def func(i, j):
return i + j
arr_func = np.fromfunction(func, (3, 3))
print(f"12. 从函数创建:\n{arr_func}")
# 从函数创建: [[0. 1. 2.] [1. 2. 3.] [2. 3. 4.]]
数组属性和数据类型
数组属性详解
# 创建一个示例数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("数组属性:")
print("="*50)
# 基本属性
print(f"1. 数组维度 (ndim): {arr.ndim}") # 数组维度 (ndim): 2
print(f"2. 数组形状 (shape): {arr.shape}") # 数组形状 (shape): (3, 3)
print(f"3. 数组大小 (size): {arr.size}") # 数组大小 (size): 9
print(f"4. 数据类型 (dtype): {arr.dtype}") # 数据类型 (dtype): int64
print(f"5. 每个元素字节数 (itemsize): {arr.itemsize} bytes") # 每个元素字节数 (itemsize): 8 bytes
print(f"6. 总字节数 (nbytes): {arr.nbytes} bytes") # 总字节数 (nbytes): 72 bytes
print(f"7. 转置 (T):\n{arr.T}") # 转置 (T): [[1 4 7] [2 5 8] [3 6 9]]
print(f"8. 实部 (real):\n{arr.real}") # 实部 (real):[[1 2 3] [4 5 6] [7 8 9]]
print(f"9. 虚部 (imag):\n{arr.imag}") # 虚部 (imag):[[0 0 0] [0 0 0] [0 0 0]]
# 复数数组示例
complex_arr = np.array([1+2j, 3+4j, 5+6j])
print(f"10. 复数数组实部: {complex_arr.real}") # 复数数组实部: [1. 3. 5.]
print(f"11. 复数数组虚部: {complex_arr.imag}") # 复数数组虚部: [2. 4. 6.]
# 扁平迭代器
print(f"12. 扁平迭代器 (flat):") # 扁平迭代器 (flat):
for item in arr.flat:
print(f" {item}", end=" ") # 1 2 3 4 5 6 7 8 9
print()
# 数据指针
print(f"13. 数据指针 (data): {arr.data}") # 数据指针 (data): <memory at 0x0000024A1DA6A9B0>
数据类型 (dtype) 详解
# NumPy 支持的数据类型
dtypes = {
'整数': {
'int8': '8位整数 (-128 to 127)',
'int16': '16位整数 (-32768 to 32767)',
'int32': '32位整数 (-2147483648 to 2147483647)',
'int64': '64位整数',
'uint8': '8位无符号整数 (0 to 255)',
'uint16': '16位无符号整数 (0 to 65535)',
'uint32': '32位无符号整数 (0 to 4294967295)',
'uint64': '64位无符号整数',
},
'浮点数': {
'float16': '半精度浮点',
'float32': '单精度浮点',
'float64': '双精度浮点',
'float128': '扩展精度浮点',
},
'复数': {
'complex64': '复数,两个32位浮点',
'complex128': '复数,两个64位浮点',
'complex256': '复数,两个128位浮点',
},
'其他': {
'bool': '布尔型 (True/False)',
'object': 'Python对象',
'string_': '字符串',
'unicode_': 'Unicode字符串',
}
}
print("NumPy 数据类型:")
print("="*50)
for category, types in dtypes.items():
print(f"\n{category}:")
for dtype_name, description in types.items():
print(f" {dtype_name:<12} - {description}")
# 数据类型示例
print("\n数据类型示例:")
print("="*50)
# 创建不同数据类型的数组
examples = [
("int8", np.array([1, 2, 3], dtype=np.int8)),
("uint8", np.array([1, 2, 3], dtype=np.uint8)),
("int16", np.array([1000, 2000, 3000], dtype=np.int16)),
("float32", np.array([1.1, 2.2, 3.3], dtype=np.float32)),
("float64", np.array([1.1, 2.2, 3.3], dtype=np.float64)),
("complex64", np.array([1+2j, 3+4j], dtype=np.complex64)),
("bool", np.array([True, False, True], dtype=bool)),
("string", np.array(['a', 'bc', 'def'], dtype='S3')), # 最大长度3字节
]
for dtype_name, arr in examples:
print(f"{dtype_name:<10}: {arr} (dtype: {arr.dtype})")
# 数据类型转换
print("\n数据类型转换:")
print("="*50)
arr_int = np.array([1, 2, 3, 4])
print(f"原始数组: {arr_int}, dtype: {arr_int.dtype}")
# 转换方法1: astype()
arr_float = arr_int.astype(np.float32)
print(f"转换为float32: {arr_float}, dtype: {arr_float.dtype}")
# 转换方法2: np.asarray()
arr_complex = np.asarray(arr_int, dtype=np.complex64)
print(f"转换为complex64: {arr_complex}, dtype: {arr_complex.dtype}")
# 转换方法3: 视图 (view)
if arr_int.dtype == np.int32:
arr_view = arr_int.view(np.float32)
print(f"视图转换: {arr_view}, dtype: {arr_view.dtype}")
# 检查类型
print(f"\n类型检查:")
print(f" np.issubdtype(arr_int.dtype, np.integer): {np.issubdtype(arr_int.dtype, np.integer)}")
print(f" np.issubdtype(arr_float.dtype, np.floating): {np.issubdtype(arr_float.dtype, np.floating)}")
print(f" np.issubdtype(arr_complex.dtype, np.complexfloating): {np.issubdtype(arr_complex.dtype, np.complexfloating)}")
NumPy 数据类型:
==================================================
整数:
int8 - 8位整数 (-128 to 127)
int16 - 16位整数 (-32768 to 32767)
int32 - 32位整数 (-2147483648 to 2147483647)
int64 - 64位整数
uint8 - 8位无符号整数 (0 to 255)
uint16 - 16位无符号整数 (0 to 65535)
uint32 - 32位无符号整数 (0 to 4294967295)
uint64 - 64位无符号整数
浮点数:
float16 - 半精度浮点
float32 - 单精度浮点
float64 - 双精度浮点
float128 - 扩展精度浮点
复数:
complex64 - 复数,两个32位浮点
complex128 - 复数,两个64位浮点
complex256 - 复数,两个128位浮点
其他:
bool - 布尔型 (True/False)
object - Python对象
string_ - 字符串
unicode_ - Unicode字符串
数据类型示例:
==================================================
int8 : [1 2 3] (dtype: int8)
uint8 : [1 2 3] (dtype: uint8)
int16 : [1000 2000 3000] (dtype: int16)
float32 : [1.1 2.2 3.3] (dtype: float32)
float64 : [1.1 2.2 3.3] (dtype: float64)
complex64 : [1.+2.j 3.+4.j] (dtype: complex64)
bool : [ True False True] (dtype: bool)
string : [b'a' b'bc' b'def'] (dtype: |S3)
数据类型转换:
==================================================
原始数组: [1 2 3 4], dtype: int64
转换为float32: [1. 2. 3. 4.], dtype: float32
转换为complex64: [1.+0.j 2.+0.j 3.+0.j 4.+0.j], dtype: complex64
类型检查:
np.issubdtype(arr_int.dtype, np.integer): True
np.issubdtype(arr_float.dtype, np.floating): True
np.issubdtype(arr_complex.dtype, np.complexfloating): True
数组索引和切片
一维数组索引
# 创建一维数组
arr = np.arange(10, 20)
print(f"原始数组: {arr}")
# 原始数组: [10 11 12 13 14 15 16 17 18 19]
print("\n一维数组索引:")
print("="*50)
# 基本索引
print(f"1. 单个索引 arr[3]: {arr[3]}") # 单个索引 arr[3]: 13
print(f"2. 负索引 arr[-1]: {arr[-1]}") # 负索引 arr[-1]: 19
print(f"3. 负索引 arr[-2]: {arr[-2]}") # 负索引 arr[-2]: 18
# 切片
print(f"\n切片操作:")
print(f"4. arr[2:6]: {arr[2:6]}") # 索引2到5 arr[2:6]: [12 13 14 15]
print(f"5. arr[:5]: {arr[:5]}") # 前5个元素 arr[:5]: [10 11 12 13 14]
print(f"6. arr[5:]: {arr[5:]}") # 从索引5开始 arr[5:]: [15 16 17 18 19]
print(f"7. arr[::2]: {arr[::2]}") # 步长为2 arr[::2]: [10 12 14 16 18]
print(f"8. arr[::-1]: {arr[::-1]}") # 反转数组 arr[::-1]: [19 18 17 16 15 14 13 12 11 10]
print(f"9. arr[1:8:3]: {arr[1:8:3]}") # 从索引1到7,步长为3 arr[1:8:3]: [11 14 17]
二维数组索引
# 创建二维数组
arr_2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print("二维数组:")
print(arr_2d)
print(f"形状: {arr_2d.shape}")
print("\n二维数组索引:")
print("="*50)
# 行索引
print(f"1. 单行 arr_2d[1]: {arr_2d[1]}") # 第二行 单行 arr_2d[1]: [5 6 7 8]
print(f"2. 多行 arr_2d[[0, 2]]:\n{arr_2d[[0, 2]]}") # 第一和第三行 多行 arr_2d[[0, 2]]:[[ 1 2 3 4] [ 9 10 11 12]]
# 列索引
print(f"3. 单列 arr_2d[:, 2]: {arr_2d[:, 2]}") # 第三列 单列 arr_2d[:, 2]: [ 3 7 11]
print(f"4. 多列 arr_2d[:, [0, 3]]:\n{arr_2d[:, [0, 3]]}") # 第一和第四列 多列 arr_2d[:, [0, 3]]:[[ 1 4] [ 5 8] [ 9 12]]
# 行列组合索引
print(f"5. 单个元素 arr_2d[1, 2]: {arr_2d[1, 2]}") # 第二行第三列 单个元素 arr_2d[1, 2]: 7
print(f"6. 多个元素 arr_2d[[0, 2], [1, 3]]: {arr_2d[[0, 2], [1, 3]]}") # [ 2 12] , [0, 2]代表行索引、[1, 3]列索引 == (0,1)和(2,3)
# 布尔索引
print(f"\n布尔索引:")
bool_mask = arr_2d > 5
print(f"7. 布尔掩码:\n{bool_mask}") # 布尔掩码:[[False False False False] [False True True True] [ True True True True]]
print(f"8. 布尔索引结果: {arr_2d[bool_mask]}") # 布尔索引结果: [ 6 7 8 9 10 11 12]
# 条件索引
print(f"9. 条件索引 arr_2d[arr_2d > 7]: {arr_2d[arr_2d > 7]}") # 条件索引 arr_2d[arr_2d > 7]: [ 8 9 10 11 12]
print(f"10. 多条件索引 arr_2d[(arr_2d > 3) & (arr_2d < 9)]: {arr_2d[(arr_2d > 3) & (arr_2d < 9)]}") # 多条件索引 arr_2d[(arr_2d > 3) & (arr_2d < 9)]: [4 5 6 7 8]
三维数组索引
# 创建三维数组
arr_3d = np.array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18]]])
print("三维数组形状:", arr_3d.shape) # (3, 2, 3)
print("\n三维数组:")
print(arr_3d)
print("\n三维数组索引:")
print("="*50)
# 各维度索引
print(f"1. 第一个二维数组 arr_3d[0]:\n{arr_3d[0]}") # 第一个二维数组 arr_3d[0]: [[1 2 3] [4 5 6]]
print(f"2. 第一个二维数组的第一行 arr_3d[0, 0]: {arr_3d[0, 0]}") # 第一个二维数组的第一行 arr_3d[0, 0]: [1 2 3]
print(f"3. 第一个二维数组的第一行第一列 arr_3d[0, 0, 0]: {arr_3d[0, 0, 0]}") # 第一个二维数组的第一行第一列 arr_3d[0, 0, 0]: 1
print(f"4. 所有二维数组的第一行 arr_3d[:, 0]:\n{arr_3d[:, 0]}") # 所有二维数组的第一行 arr_3d[:, 0]: [[ 1 2 3] [ 7 8 9] [13 14 15]]
print(f"5. 所有二维数组的第一行第一列 arr_3d[:, 0, 0]: {arr_3d[:, 0, 0]}") # 所有二维数组的第一行第一列 arr_3d[:, 0, 0]: [ 1 7 13]
# 切片
print(f"\n切片操作:")
print(f"6. 前两个二维数组 arr_3d[:2]:\n{arr_3d[:2]}") # 前两个二维数组 arr_3d[:2]:[[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]]
print(f"7. 所有二维数组的奇数行 arr_3d[:, ::2]:\n{arr_3d[:, ::2]}") # 所有二维数组的奇数行 arr_3d[:, ::2]:[[[ 1 2 3]] [[ 7 8 9]] [[13 14 15]]]
print(f"8. 所有二维数组的奇数列 arr_3d[..., ::2]:\n{arr_3d[..., ::2]}") # 所有二维数组的奇数列 arr_3d[..., ::2]:[[[ 1 3] [ 4 6]] [[ 7 9] [10 12]] [[13 15] [16 18]]]
数组形状操作
改变数组形状
# 创建数组
arr = np.arange(12)
print(f"原始数组: {arr}") # 原始数组: [ 0 1 2 3 4 5 6 7 8 9 10 11]
print(f"原始形状: {arr.shape}") # 原始形状: (12,)
print("\n改变数组形状:")
print("="*50)
# reshape
reshaped = arr.reshape(3, 4)
print(f"1. reshape(3, 4):\n{reshaped}") # reshape(3, 4):[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
# resize (会改变原数组)
arr_resized = arr.copy()
arr_resized.resize(2, 6)
print(f"2. resize(2, 6):\n{arr_resized}") # resize(2, 6):[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11]]
# flatten (返回扁平副本)
flattened = arr.flatten()
print(f"3. flatten(): {flattened}") # flatten(): [ 0 1 2 3 4 5 6 7 8 9 10 11]
# ravel (返回扁平视图)
raveled = arr.ravel()
print(f"4. ravel(): {raveled}") # ravel(): [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 转置
transposed = reshaped.T
print(f"5. 转置:\n{transposed}") # 转置: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
# 交换轴
arr_3d = np.arange(24).reshape(2, 3, 4)
print(f"6. 原始3D数组形状: {arr_3d.shape}") # 原始3D数组形状: (2, 3, 4)
swapped = np.swapaxes(arr_3d, 0, 2)
print(f" 交换轴(0,2)后形状: {swapped.shape}") # 交换轴(0,2)后形状: (4, 3, 2)
# 移动轴
moved = np.moveaxis(arr_3d, 0, -1)
print(f"7. 移动轴(0到-1)后形状: {moved.shape}") # 移动轴(0到-1)后形状: (3, 4, 2)
数组堆叠
# 创建示例数组
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
print("数组a:")
print(a)
print("\n数组b:")
print(b)
print("\n数组堆叠操作:")
print("="*50)
# 垂直堆叠
vstack = np.vstack((a, b))
print(f"1. vstack (垂直堆叠):\n{vstack}") # vstack (垂直堆叠):[[1 2] [3 4] [5 6] [7 8]]
# 水平堆叠
hstack = np.hstack((a, b))
print(f"2. hstack (水平堆叠):\n{hstack}") # hstack (水平堆叠):[[1 2 5 6] [3 4 7 8]]
# 深度堆叠
dstack = np.dstack((a, b))
print(f"3. dstack (深度堆叠):\n{dstack}") # dstack (深度堆叠):[[[1 5] [2 6]] [[3 7] [4 8]]]
# 列堆叠
column_stack = np.column_stack((a.ravel(), b.ravel()))
print(f"4. column_stack:\n{column_stack}") # column_stack:[[1 5] [2 6] [3 7] [4 8]]
# 行堆叠
row_stack = np.row_stack((a.ravel(), b.ravel()))
print(f"5. row_stack:\n{row_stack}") # row_stack:[[1 2 3 4] [5 6 7 8]]
# concatenate
concatenate_axis0 = np.concatenate((a, b), axis=0)
print(f"6. concatenate axis=0:\n{concatenate_axis0}") # concatenate axis=0:[[1 2] [3 4] [5 6] [7 8]]
concatenate_axis1 = np.concatenate((a, b), axis=1)
print(f"7. concatenate axis=1:\n{concatenate_axis1}") # concatenate axis=1:[[1 2 5 6] [3 4 7 8]]
数组运算
算术运算
# 创建数组
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
print("数组运算:")
print("="*50)
# 基本运算
print(f"数组a: {a}")
print(f"数组b: {b}")
print(f"\n1. 加法 a + b: {a + b}") # 加法 a + b: [ 6 8 10 12]
print(f"2. 减法 a - b: {a - b}") # a - b: [-4 -4 -4 -4]
print(f"3. 乘法 a * b: {a * b}") # 乘法 a * b: [ 5 12 21 32]
print(f"4. 除法 a / b: {a / b}") # 除法 a / b: [0.2 0.33333333 0.42857143 0.5 ]
print(f"5. 整除 a // b: {a // b}") # 整除 a // b: [0 0 0 0]
print(f"6. 取余 a % b: {a % b}") # 取余 a % b: [1 2 3 4]
print(f"7. 幂运算 a ** 2: {a ** 2}") # 幂运算 a ** 2: [ 1 4 9 16]
print(f"8. 平方根 √a: {np.sqrt(a)}") # 平方根 √a: [1. 1.41421356 1.73205081 2. ]
print(f"9. 指数 e^a: {np.exp(a)}") # 指数 e^a: [ 2.71828183 7.3890561 20.08553692 54.59815003]
print(f"10. 对数 log(a): {np.log(a)}") # 对数 log(a): [0. 0.69314718 1.09861229 1.38629436]
# 广播运算
print(f"\n广播运算:")
print(f"11. 标量加法 a + 10: {a + 10}") # 标量加法 a + 10: [11 12 13 14]
print(f"12. 标量乘法 a * 2: {a * 2}") # 标量乘法 a * 2: [2 4 6 8]
统计运算
# 创建数组
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print("统计运算:")
print("="*50)
print(f"数组:\n{arr}")
# 基本统计
print(f"\n1. 总和 np.sum(arr): {np.sum(arr)}") # 总和 np.sum(arr): 78
print(f"2. 均值 np.mean(arr): {np.mean(arr)}") # 均值 np.mean(arr): 6.5
print(f"3. 标准差 np.std(arr): {np.std(arr)}") # 标准差 np.std(arr): 3.452052529534663
print(f"4. 方差 np.var(arr): {np.var(arr)}") # 方差 np.var(arr): 11.916666666666666
print(f"5. 最小值 np.min(arr): {np.min(arr)}") # 最小值 np.min(arr): 1
print(f"6. 最大值 np.max(arr): {np.max(arr)}") # 最大值 np.max(arr): 12
print(f"7. 中位数 np.median(arr): {np.median(arr)}") # 中位数 np.median(arr): 6.5
print(f"8. 百分位数 np.percentile(arr, 75): {np.percentile(arr, 75)}") # 百分位数 np.percentile(arr, 75): 9.25
# 沿轴统计
print(f"\n沿轴统计:")
print(f"9. 每行和 np.sum(arr, axis=1): {np.sum(arr, axis=1)}") # 每行和 np.sum(arr, axis=1): [10 26 42]
print(f"10. 每列和 np.sum(arr, axis=0): {np.sum(arr, axis=0)}") # 每列和 np.sum(arr, axis=0): [15 18 21 24]
print(f"11. 每行均值 np.mean(arr, axis=1): {np.mean(arr, axis=1)}") # 每行均值 np.mean(arr, axis=1): [ 2.5 6.5 10.5]
print(f"12. 每列均值 np.mean(arr, axis=0): {np.mean(arr, axis=0)}") # 每列均值 np.mean(arr, axis=0): [5. 6. 7. 8.]
# 累积运算
print(f"\n累积运算:")
print(f"13. 累积和 np.cumsum(arr): {np.cumsum(arr)}") # 累积和 np.cumsum(arr): [ 1 3 6 10 15 21 28 36 45 55 66 78]
print(f"14. 累积积 np.cumprod(arr): {np.cumprod(arr)}") # 累积积 np.cumprod(arr): [ 1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600]
# 最值索引
print(f"\n最值索引:")
print(f"15. 最大值索引 np.argmax(arr): {np.argmax(arr)}") # 最大值索引 np.argmax(arr): 11
print(f"16. 最小值索引 np.argmin(arr): {np.argmin(arr)}") # 最小值索引 np.argmin(arr): 0
print(f"17. 每行最大值索引 np.argmax(arr, axis=1): {np.argmax(arr, axis=1)}") # 每行最大值索引 np.argmax(arr, axis=1): [3 3 3]
逻辑运算
# 创建数组
a = np.array([1, 2, 3, 4, 5])
b = np.array([5, 4, 3, 2, 1])
print("逻辑运算:")
print("="*50)
print(f"数组a: {a}")
print(f"数组b: {b}")
# 比较运算
print(f"\n比较运算:")
print(f"1. 大于 a > 3: {a > 3}")
print(f"2. 小于 a < 3: {a < 3}")
print(f"3. 等于 a == 3: {a == 3}")
print(f"4. 不等于 a != 3: {a != 3}")
print(f"5. 大于等于 a >= 3: {a >= 3}")
print(f"6. 小于等于 a <= 3: {a <= 3}")
print(f"7. 数组比较 a > b: {a > b}")
# 逻辑运算
print(f"\n逻辑运算:")
mask1 = a > 2
mask2 = b < 4
print(f"8. 掩码1 (a>2): {mask1}")
print(f"9. 掩码2 (b<4): {mask2}")
print(f"10. 逻辑与 np.logical_and(mask1, mask2): {np.logical_and(mask1, mask2)}")
print(f"11. 逻辑或 np.logical_or(mask1, mask2): {np.logical_or(mask1, mask2)}")
print(f"12. 逻辑非 np.logical_not(mask1): {np.logical_not(mask1)}")
print(f"13. 异或 np.logical_xor(mask1, mask2): {np.logical_xor(mask1, mask2)}")
# 条件判断
print(f"\n条件判断:")
print(f"14. 是否全为真 np.all(a > 0): {np.all(a > 0)}")
print(f"15. 是否有真 np.any(a > 4): {np.any(a > 4)}")
print(f"16. 是否包含 np.isin(a, [2, 4]): {np.isin(a, [2, 4])}")
逻辑运算:
==================================================
数组a: [1 2 3 4 5]
数组b: [5 4 3 2 1]
比较运算:
1. 大于 a > 3: [False False False True True]
2. 小于 a < 3: [ True True False False False]
3. 等于 a == 3: [False False True False False]
4. 不等于 a != 3: [ True True False True True]
5. 大于等于 a >= 3: [False False True True True]
6. 小于等于 a <= 3: [ True True True False False]
7. 数组比较 a > b: [False False False True True]
逻辑运算:
8. 掩码1 (a>2): [False False True True True]
9. 掩码2 (b<4): [False False True True True]
10. 逻辑与 np.logical_and(mask1, mask2): [False False True True True]
11. 逻辑或 np.logical_or(mask1, mask2): [False False True True True]
12. 逻辑非 np.logical_not(mask1): [ True True False False False]
13. 异或 np.logical_xor(mask1, mask2): [False False False False False]
条件判断:
14. 是否全为真 np.all(a > 0): True
15. 是否有真 np.any(a > 4): True
16. 是否包含 np.isin(a, [2, 4]): [False True False True False]
线性代数运算
矩阵运算
# 创建矩阵
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
B = np.array([[9, 8, 7],
[6, 5, 4],
[3, 2, 1]])
v = np.array([1, 2, 3])
print("线性代数运算:")
print("="*50)
print(f"矩阵A:\n{A}")
print(f"\n矩阵B:\n{B}")
print(f"\n向量v: {v}")
# 矩阵乘法
print(f"\n矩阵运算:")
print(f"1. 矩阵乘法 A @ B:\n{A @ B}")
print(f"2. 矩阵向量乘法 A @ v: {A @ v}")
# 转置
print(f"3. 矩阵转置 A.T:\n{A.T}")
# 逆矩阵
C = np.array([[4, 7],
[2, 6]])
try:
inv_C = np.linalg.inv(C)
print(f"4. 逆矩阵 inv(C):\n{inv_C}")
except np.linalg.LinAlgError:
print(f"4. 矩阵C不可逆")
# 行列式
det_A = np.linalg.det(A)
print(f"5. 行列式 det(A): {det_A}")
# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"6. 特征值: {eigenvalues}")
print(f"7. 特征向量:\n{eigenvectors}")
# 矩阵秩
rank_A = np.linalg.matrix_rank(A)
print(f"8. 矩阵秩 rank(A): {rank_A}")
# 矩阵的迹
trace_A = np.trace(A)
print(f"9. 矩阵迹 trace(A): {trace_A}")
# 解线性方程组
# Ax = b
b = np.array([1, 2, 3])
try:
x = np.linalg.solve(A, b)
print(f"10. 解方程 Ax = b: {x}")
except np.linalg.LinAlgError:
print("10. 矩阵A奇异,无法求解")
# 使用最小二乘法
x_lstsq = np.linalg.lstsq(A, b, rcond=None)[0]
print(f" 最小二乘解: {x_lstsq}")
# 范数
print(f"\n范数:")
print(f"11. 向量v的L2范数: {np.linalg.norm(v)}")
print(f"12. 向量v的L1范数: {np.linalg.norm(v, ord=1)}")
print(f"13. 矩阵A的Frobenius范数: {np.linalg.norm(A, 'fro')}")
线性代数运算:
==================================================
矩阵A:
[[1 2 3]
[4 5 6]
[7 8 9]]
矩阵B:
[[9 8 7]
[6 5 4]
[3 2 1]]
向量v: [1 2 3]
矩阵运算:
1. 矩阵乘法 A @ B:
[[ 30 24 18]
[ 84 69 54]
[138 114 90]]
2. 矩阵向量乘法 A @ v: [14 32 50]
3. 矩阵转置 A.T:
[[1 4 7]
[2 5 8]
[3 6 9]]
4. 逆矩阵 inv(C):
[[ 0.6 -0.7]
[-0.2 0.4]]
5. 行列式 det(A): 0.0
6. 特征值: [ 1.61168440e+01 -1.11684397e+00 -1.30367773e-15]
7. 特征向量:
[[-0.23197069 -0.78583024 0.40824829]
[-0.52532209 -0.08675134 -0.81649658]
[-0.8186735 0.61232756 0.40824829]]
8. 矩阵秩 rank(A): 2
9. 矩阵迹 trace(A): 15
10. 矩阵A奇异,无法求解
最小二乘解: [-0.05555556 0.11111111 0.27777778]
范数:
11. 向量v的L2范数: 3.7416573867739413
12. 向量v的L1范数: 6.0
13. 矩阵A的Frobenius范数: 16.881943016134134
随机数生成
各种随机分布
# 设置随机种子
np.random.seed(42)
print("随机数生成:")
print("="*50)
# 均匀分布
print("1. 均匀分布 [0,1):")
uniform = np.random.rand(3, 3)
print(f"np.random.rand(3,3):\n{uniform}")
# 标准正态分布
print("\n2. 标准正态分布:")
normal = np.random.randn(3, 3)
print(f"np.random.randn(3,3):\n{normal}")
# 整数随机数
print("\n3. 整数随机数:")
integers = np.random.randint(1, 100, size=(3, 4))
print(f"np.random.randint(1, 100, (3,4)):\n{integers}")
# 随机选择
print("\n4. 随机选择:")
choices = np.random.choice(['A', 'B', 'C', 'D'], size=10, p=[0.1, 0.2, 0.3, 0.4])
print(f"np.random.choice(['A','B','C','D'], size=10, p=[0.1,0.2,0.3,0.4]): {choices}")
# 打乱数组
print("\n5. 打乱数组:")
arr = np.arange(10)
np.random.shuffle(arr)
print(f"打乱后: {arr}")
# 各种概率分布
print("\n6. 各种概率分布:")
print(f" a. 正态分布 (μ=0, σ=1): {np.random.normal(0, 1, 5)}")
print(f" b. 均匀分布 [0,1): {np.random.random(5)}")
print(f" c. 二项分布 (n=10, p=0.5): {np.random.binomial(10, 0.5, 5)}")
print(f" d. 泊松分布 (λ=3): {np.random.poisson(3, 5)}")
print(f" e. 指数分布 (λ=1): {np.random.exponential(1, 5)}")
print(f" f. 伽马分布 (k=2, θ=2): {np.random.gamma(2, 2, 5)}")
print(f" g. 贝塔分布 (α=0.5, β=0.5): {np.random.beta(0.5, 0.5, 5)}")
随机数生成:
==================================================
1. 均匀分布 [0,1):
np.random.rand(3,3):
[[0.37454012 0.95071431 0.73199394]
[0.59865848 0.15601864 0.15599452]
[0.05808361 0.86617615 0.60111501]]
2. 标准正态分布:
np.random.randn(3,3):
[[-0.58087813 -0.52516981 -0.57138017]
[-0.92408284 -2.61254901 0.95036968]
[ 0.81644508 -1.523876 -0.42804606]]
3. 整数随机数:
np.random.randint(1, 100, (3,4)):
[[80 15 62 62]
[47 62 51 55]
[64 3 51 7]]
4. 随机选择:
np.random.choice(['A','B','C','D'], size=10, p=[0.1,0.2,0.3,0.4]): ['B' 'A' 'D' 'D' 'D' 'C' 'A' 'D' 'C' 'B']
5. 打乱数组:
打乱后: [6 8 4 9 1 3 0 5 2 7]
6. 各种概率分布:
a. 正态分布 (μ=0, σ=1): [-0.74240684 2.77831304 1.19363972 0.21863832 0.88176104]
b. 均匀分布 [0,1): [0.92187424 0.0884925 0.19598286 0.04522729 0.32533033]
c. 二项分布 (n=10, p=0.5): [5 4 7 4 4]
d. 泊松分布 (λ=3): [3 3 4 1 3]
e. 指数分布 (λ=1): [0.37248835 0.39331421 1.30787578 1.01488936 2.18225191]
f. 伽马分布 (k=2, θ=2): [1.30758995 3.14141472 8.87729661 4.28497711 2.40636036]
g. 贝塔分布 (α=0.5, β=0.5): [0.00243295 0.27644666 0.92984312 0.2278109 0.89831048]
文件输入输出
保存和加载数组
import os
import tempfile
# 创建示例数组
arr1 = np.array([[1, 2, 3],
[4, 5, 6]])
arr2 = np.array([7, 8, 9])
print("文件输入输出:")
print("="*50)
# 创建临时目录
temp_dir = tempfile.mkdtemp()
print(f"临时目录: {temp_dir}")
# 保存和加载单个数组
print("\n1. 单个数组保存/加载:")
np.save(os.path.join(temp_dir, 'array1.npy'), arr1)
loaded_arr1 = np.load(os.path.join(temp_dir, 'array1.npy'))
print(f"保存的数组:\n{arr1}")
print(f"加载的数组:\n{loaded_arr1}")
print(f"是否相等: {np.array_equal(arr1, loaded_arr1)}")
# 保存和加载多个数组
print("\n2. 多个数组保存/加载:")
np.savez(os.path.join(temp_dir, 'arrays.npz'), arr1=arr1, arr2=arr2)
loaded_npz = np.load(os.path.join(temp_dir, 'arrays.npz'))
print(f"保存的数组: arr1={arr1.tolist()}, arr2={arr2.tolist()}")
print(f"加载的数组: arr1={loaded_npz['arr1'].tolist()}, arr2={loaded_npz['arr2'].tolist()}")
# 压缩保存
print("\n3. 压缩保存/加载:")
np.savez_compressed(os.path.join(temp_dir, 'arrays_compressed.npz'), arr1=arr1, arr2=arr2)
loaded_compressed = np.load(os.path.join(temp_dir, 'arrays_compressed.npz'))
print(f"压缩保存成功,文件大小较小")
# 文本文件保存/加载
print("\n4. 文本文件保存/加载:")
txt_file = os.path.join(temp_dir, 'array.txt')
np.savetxt(txt_file, arr1, delimiter=',', fmt='%d')
loaded_txt = np.loadtxt(txt_file, delimiter=',')
print(f"文本文件内容:\n{open(txt_file).read()}")
print(f"加载的数组:\n{loaded_txt}")
# CSV文件
print("\n5. CSV文件保存/加载:")
csv_file = os.path.join(temp_dir, 'array.csv')
np.savetxt(csv_file, arr1, delimiter=',', fmt='%.2f')
loaded_csv = np.loadtxt(csv_file, delimiter=',')
print(f"CSV文件内容:\n{open(csv_file).read()}")
print(f"加载的数组:\n{loaded_csv}")
# 清理临时文件
import shutil
shutil.rmtree(temp_dir)
print(f"\n已清理临时目录")
高级功能
广播机制
print("广播机制:")
print("="*50)
# 示例1: 标量与数组
arr = np.array([1, 2, 3])
print(f"1. 数组: {arr}")
print(f" 标量加法: {arr + 10}")
print(f" 标量乘法: {arr * 2}")
# 示例2: 不同形状数组
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([10, 20, 30])
print(f"\n2. 数组a:\n{a}")
print(f" 数组b: {b}")
print(f" 广播加法:\n{a + b}")
# 示例3: 维度扩展
c = np.array([1, 2, 3])
d = np.array([[1], [2], [3]])
print(f"\n3. 数组c: {c}")
print(f" 数组d:\n{d}")
print(f" 广播乘法:\n{c * d}")
# 手动广播
print(f"\n4. 手动广播:")
a = np.array([1, 2, 3])
b = np.array([[1], [2], [3]])
print(f" a形状: {a.shape}")
print(f" b形状: {b.shape}")
print(f" a[:, np.newaxis]:\n{a[:, np.newaxis]}")
print(f" a + b:\n{a + b}")
广播机制:
==================================================
1. 数组: [1 2 3]
标量加法: [11 12 13]
标量乘法: [2 4 6]
2. 数组a:
[[1 2 3]
[4 5 6]]
数组b: [10 20 30]
广播加法:
[[11 22 33]
[14 25 36]]
3. 数组c: [1 2 3]
数组d:
[[1]
[2]
[3]]
广播乘法:
[[1 2 3]
[2 4 6]
[3 6 9]]
4. 手动广播:
a形状: (3,)
b形状: (3, 1)
a[:, np.newaxis]:
[[1]
[2]
[3]]
a + b:
[[2 3 4]
[3 4 5]
[4 5 6]]
向量化操作
print("向量化操作:")
print("="*50)
# 创建大型数组
large_arr = np.random.randn(1000000)
# Python循环 vs 向量化操作
import time
# 方法1: Python循环
start = time.time()
result_python = []
for x in large_arr[:1000000]: # 只取前1000000个
result_python.append(x * 2 + 1)
time_python = time.time() - start
# 方法2: NumPy向量化
start = time.time()
result_numpy = large_arr[:1000000] * 2 + 1
time_numpy = time.time() - start
print(f"Python循环时间: {time_python:.6f}秒")
print(f"NumPy向量化时间: {time_numpy:.6f}秒")
# 避免除以零错误
if time_numpy > 0:
print(f"速度提升: {time_python/time_numpy:.2f}倍")
else:
print("速度提升: 无穷大(NumPy向量化操作时间过短,无法测量)")
# 使用np.vectorize
print("\n使用np.vectorize:")
def my_func(x):
if x > 0:
return x ** 2
else:
return -x
vectorized_func = np.vectorize(my_func)
arr = np.array([-2, -1, 0, 1, 2])
print(f"原始数组: {arr}")
print(f"向量化函数结果: {vectorized_func(arr)}")
向量化操作:
==================================================
Python循环时间: 0.273143秒
NumPy向量化时间: 0.003739秒
速度提升: 73.06倍
使用np.vectorize:
原始数组: [-2 -1 0 1 2]
向量化函数结果: [2 1 0 1 4]
内存视图
print("内存视图:")
print("="*50)
# 创建数组
arr = np.arange(10)
print(f"原始数组: {arr}")
# 创建视图
view = arr.view()
view[0] = 100
print(f"修改视图后原始数组: {arr}")
# 创建副本
copy = arr.copy()
copy[0] = 999
print(f"修改副本后原始数组: {arr}")
# 内存布局
print(f"\n内存布局:")
print(f"数组是C连续: {arr.flags['C_CONTIGUOUS']}")
print(f"数组是F连续: {arr.flags['F_CONTIGUOUS']}")
print(f"数组是否可写: {arr.flags['WRITEABLE']}")
print(f"数组是否拥有数据: {arr.flags['OWNDATA']}")
内存视图:
==================================================
原始数组: [0 1 2 3 4 5 6 7 8 9]
修改视图后原始数组: [100 1 2 3 4 5 6 7 8 9]
修改副本后原始数组: [100 1 2 3 4 5 6 7 8 9]
内存布局:
数组是C连续: True
数组是F连续: True
数组是否可写: True
数组是否拥有数据: True
实用技巧和最佳实践
性能优化技巧
print("性能优化技巧:")
print("="*50)
# 1. 预分配数组
print("1. 预分配数组:")
size = 100000
# 不好的方式
start = time.time()
result = np.array([])
for i in range(size):
result = np.append(result, i**2)
time_bad = time.time() - start
print(f" 动态追加: {time_bad:.4f}秒")
# 好的方式
start = time.time()
result = np.empty(size)
for i in range(size):
result[i] = i**2
time_good = time.time() - start
print(f" 预分配: {time_good:.4f}秒")
print(f" 速度提升: {time_bad/time_good:.2f}倍")
# 2. 使用inplace操作
print("\n2. 使用inplace操作:")
arr = np.random.randn(1000, 1000)
start = time.time()
arr = arr + 1
time_not_inplace = time.time() - start
arr = np.random.randn(1000, 1000)
start = time.time()
arr += 1
time_inplace = time.time() - start
print(f" 普通操作: {time_not_inplace:.6f}秒")
print(f" inplace操作: {time_inplace:.6f}秒")
print(f" 内存节省: 普通操作创建新数组,inplace操作修改原数组")
# 3. 避免不必要的复制
print("\n3. 避免不必要的复制:")
large_array = np.random.randn(10000, 10000)
# 不好的方式:创建副本
start = time.time()
copy_array = large_array.copy()
time_copy = time.time() - start
# 好的方式:使用视图
start = time.time()
view_array = large_array[:5000, :5000]
time_view = time.time() - start
print(f" 复制时间: {time_copy:.4f}秒")
print(f" 视图时间: {time_view:.6f}秒")
print(f" 内存占用: 复制占用额外内存,视图共享内存")
1. 预分配数组:
动态追加: 4.1569秒
预分配: 0.0430秒
速度提升: 96.75倍
2. 使用inplace操作:
普通操作: 0.001502秒
inplace操作: 0.000000秒
内存节省: 普通操作创建新数组,inplace操作修改原数组
3. 避免不必要的复制:
复制时间: 0.1915秒
视图时间: 0.000000秒
内存占用: 复制占用额外内存,视图共享内存
常见错误和解决方案
print("常见错误和解决方案:")
print("="*50)
# 1. 广播错误
print("1. 广播维度不匹配:")
try:
a = np.array([[1, 2, 3]])
b = np.array([[1, 2]])
result = a + b
except ValueError as e:
print(f" 错误: {e}")
print(f" 解决方案: 确保数组形状兼容")
# 2. 类型转换错误
print("\n2. 类型转换:")
arr = np.array([1.5, 2.7, 3.1])
int_arr = arr.astype(int)
print(f" 浮点数数组: {arr}")
print(f" 转换为整数: {int_arr} (注意: 向下取整)")
# 3. 原地操作和副本
print("\n3. 原地操作问题:")
arr = np.array([1, 2, 3, 4, 5])
subset = arr[1:4]
subset[0] = 999
print(f" 修改子集后原数组: {arr} (被修改!)")
print(f" 解决方案: 使用 arr[1:4].copy()")
# 4. 内存溢出
print("\n4. 内存溢出预防:")
try:
# 尝试创建非常大的数组
huge_array = np.zeros((10000, 10000, 10000))
except MemoryError as e:
print(f" 内存错误: {e}")
print(f" 解决方案:")
print(f" a. 使用稀疏矩阵")
print(f" b. 使用内存映射文件")
print(f" c. 分批处理")
完整实战示例
图像处理示例
# 模拟图像处理
print("图像处理示例:")
print("="*50)
# 创建模拟图像 (300x400 RGB)
height, width, channels = 300, 400, 3
image = np.random.randint(0, 256, (height, width, channels), dtype=np.uint8)
print(f"图像形状: {image.shape}")
print(f"图像数据类型: {image.dtype}")
print(f"像素值范围: [{image.min()}, {image.max()}]")
# 图像操作
print("\n图像操作:")
# 转换为灰度图
gray_image = np.mean(image, axis=2).astype(np.uint8)
print(f"1. 灰度图形状: {gray_image.shape}")
# 调整亮度
bright_image = np.clip(image.astype(np.int16) + 50, 0, 255).astype(np.uint8)
print(f"2. 调整亮度后范围: [{bright_image.min()}, {bright_image.max()}]")
# 图像旋转
rotated_image = np.rot90(image)
print(f"3. 旋转后形状: {rotated_image.shape}")
# 图像裁剪
cropped_image = image[50:250, 100:300, :]
print(f"4. 裁剪后形状: {cropped_image.shape}")
# 添加噪声
noise = np.random.normal(0, 25, image.shape).astype(np.int16)
noisy_image = np.clip(image.astype(np.int16) + noise, 0, 255).astype(np.uint8)
print(f"5. 加噪声后SNR: {np.std(image)/np.std(noise):.2f}")
图像处理示例:
==================================================
图像形状: (300, 400, 3)
图像数据类型: uint8
像素值范围: [0, 255]
图像操作:
1. 灰度图形状: (300, 400)
2. 调整亮度后范围: [50, 255]
3. 旋转后形状: (400, 300, 3)
4. 裁剪后形状: (200, 200, 3)
5. 加噪声后SNR: 3.01
机器学习数据预处理
# 机器学习数据预处理
print("\n机器学习数据预处理:")
print("="*50)
# 创建模拟数据集
n_samples = 1000
n_features = 20
# 特征矩阵
X = np.random.randn(n_samples, n_features)
# 添加一些异常值和缺失值
X[10, 5] = 100 # 异常值
X[20, 10] = np.nan # 缺失值
# 目标变量
y = np.random.randn(n_samples)
print(f"数据集形状: X={X.shape}, y={y.shape}")
# 数据预处理步骤
print("\n数据预处理步骤:")
# 1. 处理缺失值
from numpy import nanmean
X_filled = np.where(np.isnan(X), nanmean(X, axis=0), X)
print(f"1. 缺失值处理: 用列均值填充")
# 2. 去除异常值
from scipy import stats
z_scores = np.abs(stats.zscore(X_filled))
X_no_outliers = X_filled[(z_scores < 3).all(axis=1)]
print(f"2. 异常值处理: 去除{len(X_filled)-len(X_no_outliers)}个样本")
# 3. 标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_no_outliers)
print(f"3. 标准化: 均值={X_scaled.mean():.2f}, 标准差={X_scaled.std():.2f}")
# 4. 特征选择 (基于方差)
variances = np.var(X_scaled, axis=0)
high_var_features = np.where(variances > 0.1)[0]
print(f"4. 特征选择: 保留{len(high_var_features)}个高方差特征")
# 5. 数据集划分
train_size = int(0.8 * len(X_scaled))
X_train, X_test = X_scaled[:train_size], X_scaled[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
print(f"5. 数据集划分: 训练集{X_train.shape}, 测试集{X_test.shape}")
机器学习数据预处理:
==================================================
数据集形状: X=(1000, 20), y=(1000,)
数据预处理步骤:
1. 缺失值处理: 用列均值填充
2. 异常值处理: 去除58个样本
3. 标准化: 均值=0.00, 标准差=1.00
4. 特征选择: 保留20个高方差特征
5. 数据集划分: 训练集(753, 20), 测试集(189, 20)
NumPy 最佳实践总结
代码规范
# ✅ 推荐的做法
import numpy as np
# 清晰的变量名
data_matrix = np.random.randn(100, 50)
row_sums = np.sum(data_matrix, axis=1)
column_means = np.mean(data_matrix, axis=0)
# 使用向量化操作而不是循环
result = np.sqrt(data_matrix ** 2 + 1)
# 适当使用注释
# 标准化数据: (x - mean) / std
normalized_data = (data_matrix - np.mean(data_matrix)) / np.std(data_matrix)
# 处理边界情况
safe_data = np.where(np.isnan(data_matrix), 0, data_matrix)
性能优化
# 性能优化技巧总结
optimization_tips = {
'预分配内存': '使用 np.empty() 或 np.zeros() 预分配数组',
'向量化操作': '避免 Python 循环,使用 NumPy 向量化',
'使用视图': '切片返回视图,而不是副本',
'适当的数据类型': '使用最小够用的数据类型',
'内存连续': '确保数组在内存中是连续的',
'批量操作': '一次处理大量数据,而不是逐个处理',
'使用内置函数': '优先使用 NumPy 内置函数',
'避免不必要的复制': '使用 copy() 只在需要时',
}
print("NumPy 性能优化技巧:")
for tip, description in optimization_tips.items():
print(f" ✅ {tip}: {description}")
常用函数速查表
基础创建
|
函数 |
说明 |
示例 |
返回值 |
|---|---|---|---|
|
|
创建数组 |
|
|
|
|
转换为数组 |
|
|
|
|
等间隔数组 |
|
|
|
|
等差数列 |
|
|
|
|
等比数列 |
|
|
|
|
几何间隔 |
|
|
特殊数组
|
函数 |
说明 |
示例 |
形状 |
|---|---|---|---|
|
|
全零数组 |
|
(2,3) |
|
|
全一数组 |
|
(3,2) |
|
|
全值数组 |
|
(2,2)全7 |
|
|
未初始化数组 |
|
(3,3) |
|
|
单位矩阵 |
|
3×3单位阵 |
|
|
单位矩阵 |
|
3×3单位阵 |
|
|
对角矩阵 |
|
3×3对角阵 |
网格创建
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
坐标矩阵 |
|
|
|
密集网格 |
|
|
|
开放网格 |
|
|
|
索引网格 |
|
数组操作函数
形状操作
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
改变形状 |
|
|
|
调整大小 |
|
|
|
扁平化(副本) |
|
|
|
扁平化(视图) |
|
|
|
转置 |
|
|
|
转置 |
|
|
|
交换轴 |
|
|
|
移动轴 |
|
|
|
删除单维度 |
|
|
|
增加维度 |
|
数组组合
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
连接数组 |
|
|
|
堆叠数组 |
|
|
|
垂直堆叠 |
|
|
|
水平堆叠 |
|
|
|
深度堆叠 |
|
|
|
列堆叠 |
|
|
|
行堆叠 |
|
|
|
块组合 |
|
数组分割
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
分割数组 |
|
|
|
不等分割 |
|
|
|
垂直分割 |
|
|
|
水平分割 |
|
|
|
深度分割 |
|
数组复制
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
深度复制 |
|
|
|
创建视图 |
|
|
|
类型转换 |
|
|
|
转为字节 |
|
|
|
转为列表 |
|
数学运算函数
算术运算
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
加法 |
|
|
|
减法 |
|
|
|
乘法 |
|
|
|
除法 |
|
|
|
整除 |
|
|
|
取余 |
|
|
|
幂运算 |
|
|
|
平方根 |
|
|
|
平方 |
|
|
|
绝对值 |
|
|
|
浮点绝对值 |
|
|
|
符号函数 |
|
|
|
向上取整 |
|
|
|
向下取整 |
|
|
|
截断取整 |
|
|
|
四舍五入 |
|
|
|
舍入 |
|
指数对数
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
e的指数 |
|
|
|
exp(x)-1 |
|
|
|
2的指数 |
|
|
|
自然对数 |
|
|
|
常用对数 |
|
|
|
以2为底对数 |
|
|
|
log(1+x) |
|
三角函数
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
正弦 |
|
|
|
余弦 |
|
|
|
正切 |
|
|
|
反正弦 |
|
|
|
反余弦 |
|
|
|
反正切 |
|
|
|
度转弧度 |
|
|
|
弧度转度 |
|
|
|
斜边长度 |
|
统计函数
基本统计
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
求和 |
|
|
|
均值 |
|
|
|
加权平均 |
|
|
|
中位数 |
|
|
|
标准差 |
|
|
|
方差 |
|
|
|
最小值 |
|
|
|
最大值 |
|
|
|
极差(最大-最小) |
|
|
|
百分位数 |
|
|
|
分位数 |
|
累积统计
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
累积和 |
|
|
|
累积积 |
|
|
|
忽略NaN的累积和 |
|
|
|
忽略NaN的累积积 |
|
最值索引
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
最小值索引 |
|
|
|
最大值索引 |
|
|
|
排序索引 |
|
|
|
非零索引 |
|
|
|
忽略NaN的最小值索引 |
|
|
|
忽略NaN的最大值索引 |
|
线性代数函数
矩阵运算
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
点积 |
|
|
|
矩阵乘法 |
|
|
|
向量内积 |
|
|
|
向量外积 |
|
|
|
向量叉积 |
|
|
|
张量点积 |
|
|
|
Kronecker积 |
|
矩阵分解
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
矩阵求逆 |
|
|
|
伪逆 |
|
|
|
行列式 |
|
|
|
特征值/特征向量 |
|
|
|
特征值 |
|
|
|
奇异值分解 |
|
|
|
QR分解 |
|
|
|
Cholesky分解 |
|
线性方程
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
解线性方程 |
|
|
|
最小二乘解 |
|
|
|
矩阵秩 |
|
|
|
矩阵迹 |
|
|
|
范数 |
|
|
|
条件数 |
|
随机数函数
基础随机
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
[0,1)均匀分布 |
|
|
|
标准正态分布 |
|
|
|
随机整数 |
|
|
|
随机浮点数 |
|
|
|
随机选择 |
|
|
|
打乱数组 |
|
|
|
随机排列 |
|
|
|
设置随机种子 |
|
概率分布
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
均匀分布 |
|
|
|
正态分布 |
|
|
|
二项分布 |
|
|
|
泊松分布 |
|
|
|
指数分布 |
|
|
|
伽马分布 |
|
|
|
贝塔分布 |
|
|
|
卡方分布 |
|
|
|
F分布 |
|
|
|
几何分布 |
|
逻辑函数
比较运算
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
大于 |
|
|
|
大于等于 |
|
|
|
小于 |
|
|
|
小于等于 |
|
|
|
等于 |
|
|
|
不等于 |
|
|
|
数组相等 |
|
逻辑运算
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
逻辑与 |
|
|
|
逻辑或 |
|
|
|
逻辑非 |
|
|
|
逻辑异或 |
|
|
|
所有为真 |
|
|
|
任一为真 |
|
|
|
近似相等 |
|
|
|
全部近似相等 |
|
|
|
是否是NaN |
|
|
|
是否是无穷 |
|
|
|
是否有限 |
|
|
|
是否是实数 |
|
|
|
是否是复数 |
|
|
|
是否包含 |
|
集合函数
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
唯一值 |
|
|
|
交集 |
|
|
|
并集 |
|
|
|
差集 |
|
|
|
对称差 |
|
|
|
元素是否在数组中 |
|
排序搜索函数
1. 排序
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
排序 |
|
|
|
排序索引 |
|
|
|
多键排序 |
|
|
|
沿第一轴排序 |
|
|
|
复数排序 |
|
|
|
部分排序 |
|
|
|
部分排序索引 |
|
搜索
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
条件索引 |
|
|
|
查找插入位置 |
|
|
|
提取满足条件元素 |
|
|
|
非零元素索引 |
|
|
|
扁平数组非零索引 |
|
|
|
非零元素计数 |
|
输入输出函数
文件操作
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
保存数组(.npy) |
|
|
|
加载数组 |
|
|
|
保存多个数组(.npz) |
|
|
|
压缩保存 |
|
|
|
保存为文本 |
|
|
|
加载文本 |
|
|
|
从文本生成数组 |
|
|
|
从文件读取 |
|
|
|
写入文件 |
|
实用工具函数
类型检查
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
是否是标量 |
|
|
|
是否是复数对象 |
|
|
|
是否是实数对象 |
|
|
|
是否是子类型 |
|
|
|
是否可以类型转换 |
|
数组操作
|
函数 |
说明 |
示例 |
|---|---|---|
|
|
填充数组 |
|
|
|
重复元素 |
|
|
|
平铺数组 |
|
|
|
翻转数组 |
|
|
|
左右翻转 |
|
|
|
上下翻转 |
|
|
|
旋转90度 |
|
|
|
滚动元素 |
|
|
|
滚动轴 |
|
|
|
差分 |
|
|
|
梯度 |
|
|
|
累积和 |
|
|
|
上三角矩阵 |
|
|
|
下三角矩阵 |
|
|
|
提取/创建对角线 |
|
|
|
创建对角矩阵 |
|
|
|
矩阵迹 |
|

浙公网安备 33010602011771号