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}")

常用函数速查表

基础创建

函数

说明

示例

返回值

np.array()​

创建数组

np.array([1,2,3])

[1 2 3]

np.asarray()​

转换为数组

np.asarray([1,2,3])

[1 2 3]

np.arange()​

等间隔数组

np.arange(0, 5, 1)

[0 1 2 3 4]

np.linspace()​

等差数列

np.linspace(0, 1, 5)

[0. 0.25 0.5 0.75 1.]

np.logspace()​

等比数列

np.logspace(0, 2, 3)

[1. 10. 100.]

np.geomspace()​

几何间隔

np.geomspace(1, 8, 4)

[1. 2. 4. 8.]

特殊数组

函数

说明

示例

形状

np.zeros()​

全零数组

np.zeros((2,3))

(2,3)

np.ones()​

全一数组

np.ones((3,2))

(3,2)

np.full()​

全值数组

np.full((2,2), 7)

(2,2)全7

np.empty()​

未初始化数组

np.empty((3,3))

(3,3)

np.eye()​

单位矩阵

np.eye(3)

3×3单位阵

np.identity()​

单位矩阵

np.identity(3)

3×3单位阵

np.diag()​

对角矩阵

np.diag([1,2,3])

3×3对角阵

网格创建

函数

说明

示例

np.meshgrid()​

坐标矩阵

x,y = np.meshgrid([0,1],[0,1])

np.mgrid()​

密集网格

x,y = np.mgrid[0:2, 0:2]

np.ogrid()​

开放网格

x,y = np.ogrid[0:2, 0:2]

np.indices()​

索引网格

np.indices((2,3))

数组操作函数

形状操作

函数

说明

示例

reshape()​

改变形状

arr.reshape(2,3)

resize()​

调整大小

np.resize(arr, (3,3))

flatten()​

扁平化(副本)

arr.flatten()

ravel()​

扁平化(视图)

arr.ravel()

T​

转置

arr.T

transpose()​

转置

arr.transpose()

swapaxes()​

交换轴

arr.swapaxes(0,1)

moveaxis()​

移动轴

np.moveaxis(arr, 0, -1)

squeeze()​

删除单维度

arr.squeeze()

expand_dims()​

增加维度

np.expand_dims(arr, axis=0)

数组组合

函数

说明

示例

concatenate()​

连接数组

np.concatenate((a,b), axis=0)

stack()​

堆叠数组

np.stack((a,b), axis=0)

vstack()​

垂直堆叠

np.vstack((a,b))

hstack()​

水平堆叠

np.hstack((a,b))

dstack()​

深度堆叠

np.dstack((a,b))

column_stack()​

列堆叠

np.column_stack((a,b))

row_stack()​

行堆叠

np.row_stack((a,b))

block()​

块组合

np.block([[a,b],[c,d]])

数组分割

函数

说明

示例

split()​

分割数组

np.split(arr, 3)

array_split()​

不等分割

np.array_split(arr, 3)

vsplit()​

垂直分割

np.vsplit(arr, 2)

hsplit()​

水平分割

np.hsplit(arr, 2)

dsplit()​

深度分割

np.dsplit(arr, 2)

数组复制

函数

说明

示例

copy()​

深度复制

arr.copy()

view()​

创建视图

arr.view()

astype()​

类型转换

arr.astype(np.float32)

tobytes()​

转为字节

arr.tobytes()

tolist()​

转为列表

arr.tolist()

数学运算函数

算术运算

函数

说明

示例

np.add()​

加法

np.add(a, b)

np.subtract()​

减法

np.subtract(a, b)

np.multiply()​

乘法

np.multiply(a, b)

np.divide()​

除法

np.divide(a, b)

np.floor_divide()​

整除

np.floor_divide(a, b)

np.mod()​

取余

np.mod(a, b)

np.power()​

幂运算

np.power(a, 2)

np.sqrt()​

平方根

np.sqrt(a)

np.square()​

平方

np.square(a)

np.absolute()​

绝对值

np.absolute(a)

np.fabs()​

浮点绝对值

np.fabs(a)

np.sign()​

符号函数

np.sign(a)

np.ceil()​

向上取整

np.ceil(a)

np.floor()​

向下取整

np.floor(a)

np.trunc()​

截断取整

np.trunc(a)

np.rint()​

四舍五入

np.rint(a)

np.round()​

舍入

np.round(a, 2)

指数对数

函数

说明

示例

np.exp()​

e的指数

np.exp(a)

np.expm1()​

exp(x)-1

np.expm1(a)

np.exp2()​

2的指数

np.exp2(a)

np.log()​

自然对数

np.log(a)

np.log10()​

常用对数

np.log10(a)

np.log2()​

以2为底对数

np.log2(a)

np.log1p()​

log(1+x)

np.log1p(a)

三角函数

函数

说明

示例

np.sin()​

正弦

np.sin(a)

np.cos()​

余弦

np.cos(a)

np.tan()​

正切

np.tan(a)

np.arcsin()​

反正弦

np.arcsin(a)

np.arccos()​

反余弦

np.arccos(a)

np.arctan()​

反正切

np.arctan(a)

np.deg2rad()​

度转弧度

np.deg2rad(180)

np.rad2deg()​

弧度转度

np.rad2deg(np.pi)

np.hypot()​

斜边长度

np.hypot(3,4)

统计函数

基本统计

函数

说明

示例

np.sum()​

求和

np.sum(arr)

np.mean()​

均值

np.mean(arr)

np.average()​

加权平均

np.average(arr, weights=w)

np.median()​

中位数

np.median(arr)

np.std()​

标准差

np.std(arr)

np.var()​

方差

np.var(arr)

np.min()​

最小值

np.min(arr)

np.max()​

最大值

np.max(arr)

np.ptp()​

极差(最大-最小)

np.ptp(arr)

np.percentile()​

百分位数

np.percentile(arr, 75)

np.quantile()​

分位数

np.quantile(arr, 0.75)

累积统计

函数

说明

示例

np.cumsum()​

累积和

np.cumsum(arr)

np.cumprod()​

累积积

np.cumprod(arr)

np.nancumsum()​

忽略NaN的累积和

np.nancumsum(arr)

np.nancumprod()​

忽略NaN的累积积

np.nancumprod(arr)

最值索引

函数

说明

示例

np.argmin()​

最小值索引

np.argmin(arr)

np.argmax()​

最大值索引

np.argmax(arr)

np.argsort()​

排序索引

np.argsort(arr)

np.argwhere()​

非零索引

np.argwhere(arr > 0)

np.nanargmin()​

忽略NaN的最小值索引

np.nanargmin(arr)

np.nanargmax()​

忽略NaN的最大值索引

np.nanargmax(arr)

线性代数函数

矩阵运算

函数

说明

示例

np.dot()​

点积

np.dot(a, b)

@运算符​

矩阵乘法

a @ b

np.inner()​

向量内积

np.inner(a, b)

np.outer()​

向量外积

np.outer(a, b)

np.cross()​

向量叉积

np.cross(a, b)

np.tensordot()​

张量点积

np.tensordot(a, b, axes=1)

np.kron()​

Kronecker积

np.kron(a, b)

矩阵分解

函数

说明

示例

np.linalg.inv()​

矩阵求逆

np.linalg.inv(A)

np.linalg.pinv()​

伪逆

np.linalg.pinv(A)

np.linalg.det()​

行列式

np.linalg.det(A)

np.linalg.eig()​

特征值/特征向量

np.linalg.eig(A)

np.linalg.eigvals()​

特征值

np.linalg.eigvals(A)

np.linalg.svd()​

奇异值分解

np.linalg.svd(A)

np.linalg.qr()​

QR分解

np.linalg.qr(A)

np.linalg.cholesky()​

Cholesky分解

np.linalg.cholesky(A)

线性方程

函数

说明

示例

np.linalg.solve()​

解线性方程

np.linalg.solve(A, b)

np.linalg.lstsq()​

最小二乘解

np.linalg.lstsq(A, b)

np.linalg.matrix_rank()​

矩阵秩

np.linalg.matrix_rank(A)

np.trace()​

矩阵迹

np.trace(A)

np.linalg.norm()​

范数

np.linalg.norm(v)

np.linalg.cond()​

条件数

np.linalg.cond(A)

随机数函数

基础随机

函数

说明

示例

np.random.rand()​

[0,1)均匀分布

np.random.rand(3,3)

np.random.randn()​

标准正态分布

np.random.randn(3,3)

np.random.randint()​

随机整数

np.random.randint(0,10,5)

np.random.random()​

随机浮点数

np.random.random(5)

np.random.choice()​

随机选择

np.random.choice([1,2,3], 5)

np.random.shuffle()​

打乱数组

np.random.shuffle(arr)

np.random.permutation()​

随机排列

np.random.permutation(arr)

np.random.seed()​

设置随机种子

np.random.seed(42)

概率分布

函数

说明

示例

np.random.uniform()​

均匀分布

np.random.uniform(0,1,5)

np.random.normal()​

正态分布

np.random.normal(0,1,5)

np.random.binomial()​

二项分布

np.random.binomial(10,0.5,5)

np.random.poisson()​

泊松分布

np.random.poisson(3,5)

np.random.exponential()​

指数分布

np.random.exponential(1,5)

np.random.gamma()​

伽马分布

np.random.gamma(2,2,5)

np.random.beta()​

贝塔分布

np.random.beta(2,5,5)

np.random.chisquare()​

卡方分布

np.random.chisquare(2,5)

np.random.f()​

F分布

np.random.f(5,2,5)

np.random.geometric()​

几何分布

np.random.geometric(0.5,5)

逻辑函数

比较运算

函数

说明

示例

np.greater()​

大于

np.greater(a, b)

np.greater_equal()​

大于等于

np.greater_equal(a, b)

np.less()​

小于

np.less(a, b)

np.less_equal()​

小于等于

np.less_equal(a, b)

np.equal()​

等于

np.equal(a, b)

np.not_equal()​

不等于

np.not_equal(a, b)

np.array_equal()​

数组相等

np.array_equal(a, b)

逻辑运算

函数

说明

示例

np.logical_and()​

逻辑与

np.logical_and(a>0, b>0)

np.logical_or()​

逻辑或

np.logical_or(a>0, b>0)

np.logical_not()​

逻辑非

np.logical_not(a>0)

np.logical_xor()​

逻辑异或

np.logical_xor(a>0, b>0)

np.all()​

所有为真

np.all(a>0)

np.any()​

任一为真

np.any(a>0)

np.isclose()​

近似相等

np.isclose(a, b)

np.allclose()​

全部近似相等

np.allclose(a, b)

np.isnan()​

是否是NaN

np.isnan(a)

np.isinf()​

是否是无穷

np.isinf(a)

np.isfinite()​

是否有限

np.isfinite(a)

np.isreal()​

是否是实数

np.isreal(a)

np.iscomplex()​

是否是复数

np.iscomplex(a)

np.isin()​

是否包含

np.isin(a, [1,2,3])

集合函数

函数

说明

示例

np.unique()​

唯一值

np.unique(arr)

np.intersect1d()​

交集

np.intersect1d(a, b)

np.union1d()​

并集

np.union1d(a, b)

np.setdiff1d()​

差集

np.setdiff1d(a, b)

np.setxor1d()​

对称差

np.setxor1d(a, b)

np.in1d()​

元素是否在数组中

np.in1d(a, b)

排序搜索函数

1. 排序

函数

说明

示例

np.sort()​

排序

np.sort(arr)

np.argsort()​

排序索引

np.argsort(arr)

np.lexsort()​

多键排序

np.lexsort((a, b))

np.msort()​

沿第一轴排序

np.msort(arr)

np.sort_complex()​

复数排序

np.sort_complex(arr)

np.partition()​

部分排序

np.partition(arr, 3)

np.argpartition()​

部分排序索引

np.argpartition(arr, 3)

搜索

函数

说明

示例

np.where()​

条件索引

np.where(arr>5)

np.searchsorted()​

查找插入位置

np.searchsorted(arr, 5)

np.extract()​

提取满足条件元素

np.extract(arr>5, arr)

np.nonzero()​

非零元素索引

np.nonzero(arr)

np.flatnonzero()​

扁平数组非零索引

np.flatnonzero(arr)

np.count_nonzero()​

非零元素计数

np.count_nonzero(arr)

输入输出函数

文件操作

函数

说明

示例

np.save()​

保存数组(.npy)

np.save('arr.npy', arr)

np.load()​

加载数组

np.load('arr.npy')

np.savez()​

保存多个数组(.npz)

np.savez('data.npz', a=arr1, b=arr2)

np.savez_compressed()​

压缩保存

np.savez_compressed('data.npz', arr)

np.savetxt()​

保存为文本

np.savetxt('data.txt', arr)

np.loadtxt()​

加载文本

np.loadtxt('data.txt')

np.genfromtxt()​

从文本生成数组

np.genfromtxt('data.csv', delimiter=',')

np.fromfile()​

从文件读取

np.fromfile('data.bin', dtype=float)

np.tofile()​

写入文件

arr.tofile('data.bin')

实用工具函数

类型检查

函数

说明

示例

np.isscalar()​

是否是标量

np.isscalar(5)

np.iscomplexobj()​

是否是复数对象

np.iscomplexobj(arr)

np.isrealobj()​

是否是实数对象

np.isrealobj(arr)

np.issubdtype()​

是否是子类型

np.issubdtype(arr.dtype, np.integer)

np.can_cast()​

是否可以类型转换

np.can_cast(arr.dtype, np.float32)

数组操作

函数

说明

示例

np.pad()​

填充数组

np.pad(arr, 1, mode='constant')

np.repeat()​

重复元素

np.repeat(arr, 3)

np.tile()​

平铺数组

np.tile(arr, (2,3))

np.flip()​

翻转数组

np.flip(arr)

np.fliplr()​

左右翻转

np.fliplr(arr)

np.flipud()​

上下翻转

np.flipud(arr)

np.rot90()​

旋转90度

np.rot90(arr)

np.roll()​

滚动元素

np.roll(arr, 2)

np.rollaxis()​

滚动轴

np.rollaxis(arr, 0, 2)

np.diff()​

差分

np.diff(arr)

np.gradient()​

梯度

np.gradient(arr)

np.cumsum()​

累积和

np.cumsum(arr)

np.triu()​

上三角矩阵

np.triu(arr)

np.tril()​

下三角矩阵

np.tril(arr)

np.diag()​

提取/创建对角线

np.diag(arr)

np.diagflat()​

创建对角矩阵

np.diagflat(arr)

np.trace()​

矩阵迹

np.trace(arr)

 

posted @ 2026-03-09 18:20  小吉猫  阅读(49)  评论(0)    收藏  举报