← 返回首页
🔢

NumPy基础:ndarray、创建、索引与运算

📂 python ⏱ 3 min 423 words

NumPy基础:ndarray、创建、索引与运算

NumPy(Numerical Python)是Python科学计算的核心库,提供了高性能的多维数组对象和丰富的数学函数。几乎所有数据科学和机器学习库都建立在NumPy之上。本文将带你掌握NumPy的基础知识。

什么是ndarray

ndarray(N-dimensional array)是NumPy的核心数据结构,是一个快速、灵活的多维数组容器。与Python原生列表相比,ndarray具有以下优势:

import numpy as np

# 创建一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr)          # [1 2 3 4 5]
print(type(arr))    # <class 'numpy.ndarray'>
print(arr.dtype)    # int64
print(arr.shape)    # (5,)

数组创建方式

NumPy提供了多种创建数组的方式,适用于不同场景:

import numpy as np

# 从Python列表创建
arr1 = np.array([1, 2, 3, 4, 5])

# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape)   # (2, 3)

# 创建全零数组
zeros = np.zeros((3, 4))       # 3x4的零矩阵
zeros_int = np.zeros((2, 3), dtype=int)

# 创建全一数组
ones = np.ones((2, 3))

# 创建单位矩阵
eye = np.eye(4)                 # 4x4单位矩阵

# 创建等差序列
linear = np.arange(0, 10, 2)   # [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # 0到1之间均匀取5个点

# 创建随机数组
rand_arr = np.random.rand(3, 3)      # 均匀分布 [0, 1)
randn_arr = np.random.randn(3, 3)    # 标准正态分布

索引与切片

ndarray支持强大的索引和切片操作,与Python列表类似但更强大:

import numpy as np

arr = np.array([10, 20, 30, 40, 50, 60])

# 基本索引
print(arr[0])       # 10
print(arr[-1])      # 60

# 切片
print(arr[1:4])     # [20 30 40]
print(arr[::2])     # [10 30 50]  步长为2

# 二维数组索引
arr2d = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

print(arr2d[0, 0])     # 1
print(arr2d[1, :])     # [4 5 6]  第二行
print(arr2d[:, 1])     # [2 5 8]  第二列

# 布尔索引
data = np.array([15, 22, 8, 30, 12])
mask = data > 15
print(data[mask])       # [15 22 30]

# 花式索引
indices = [0, 2, 4]
print(data[indices])    # [15  8 12]

向量化运算

NumPy的核心优势在于向量化运算——无需显式循环即可对整个数组进行操作:

import numpy as np

a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])

# 逐元素运算
print(a + b)        # [11 22 33 44 55]
print(a * b)        # [10 40 90 160 250]
print(a ** 2)       # [ 1  4  9 16 25]
print(a / 2)        # [0.5 1.  1.5 2.  2.5]

# 数学函数
print(np.sqrt(a))   # [1.         1.41421356 1.73205081 2.         2.23606798]
print(np.log(a))    # [0.         0.69314718 1.09861229 1.38629436 1.60943791]
print(np.exp(a))    # [  2.71828183   7.3890561   20.08553692  54.59815003 148.4131591 ]

# 统计运算
print(np.mean(a))   # 3.0
print(np.sum(a))    # 15
print(np.max(a))    # 5
print(np.std(a))    # 1.4142135623730951

# 矩阵运算
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])

# 矩阵乘法
print(np.dot(matrix_a, matrix_b))  # 或 matrix_a @ matrix_b
# [[19 22]
#  [43 50]]

数组变形与合并

import numpy as np

# reshape变形
arr = np.arange(12)
reshaped = arr.reshape(3, 4)
print(reshaped)

# 展平数组
flattened = reshaped.flatten()   # 返回副本
raveled = reshaped.ravel()       # 返回视图

# 数组合并
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 水平拼接
horizontal = np.hstack((a, b))      # [1 2 3 4 5 6]

# 垂直拼接
vertical = np.vstack((a, b))        # [[1 2 3] [4 5 6]]

# concatenate通用合并
merged = np.concatenate((a, b), axis=0)

实战示例:成绩分析

import numpy as np

# 模拟学生成绩
math_scores = np.array([85, 92, 78, 90, 88, 76, 95, 82])
english_scores = np.array([80, 85, 90, 88, 75, 92, 87, 83])

# 计算平均分
avg_math = np.mean(math_scores)
avg_english = np.mean(english_scores)
print(f"数学平均分: {avg_math:.1f}")
print(f"英语平均分: {avg_english:.1f}")

# 计算总分
total = math_scores + english_scores
print(f"总分分布: {total}")

# 找出数学成绩优秀的学生
excellent = math_scores >= 90
print(f"优秀学生人数: {np.sum(excellent)}")

# 成绩标准差
print(f"数学成绩标准差: {np.std(math_scores):.2f}")

总结

NumPy是Python数据科学的基石。掌握ndarray的创建、索引和运算是后续学习Pandas、Matplotlib、Scikit-learn的基础。建议多动手练习,熟悉各种数组操作,逐步建立向量化思维,这将大幅提升你的数据分析效率。