You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将粒子位置数据映射到Meshgrid网格?

粒子位置到Meshgrid的映射与动态可视化实现

1. 坐标转网格索引

首先要把粒子的(x,y)坐标映射到你生成的Meshgrid对应的索引上,这样才能关联到网格单元。用np.digitize可以快速完成这个转换:

假设你的粒子位置数组为particle_positions,形状是(时间步数T, 粒子数N, 2),最后一维对应x、y坐标:

# 计算每个粒子坐标对应的网格索引(转为0-based)
x_indices = np.digitize(particle_positions[..., 0], x) - 1
y_indices = np.digitize(particle_positions[..., 1], y) - 1

# 过滤超出网格范围的粒子,避免索引越界
valid_mask = (x_indices >= 0) & (x_indices < z) & (y_indices >= 0) & (y_indices < z)
x_indices = np.where(valid_mask, x_indices, 0)  # 或直接过滤无效数据:x_indices = x_indices[valid_mask]
y_indices = np.where(valid_mask, y_indices, 0)

2. 生成时间序列网格密度图

对每个时间步,统计每个网格单元内的粒子数量,得到密度矩阵:

# 初始化密度数组:[时间步, 网格行数, 网格列数]
density = np.zeros((T, z, z), dtype=int)

for t in range(T):
    # 给当前时间步的网格单元计数加1
    np.add.at(density[t], (y_indices[t], x_indices[t]), 1)

3. 动态可视化

用matplotlib的动画功能展示粒子分布随时间的变化:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots(figsize=(8, 6))
# 初始显示第一个时间步的密度图
im = ax.imshow(density[0], extent=[a, b, a, b], origin='lower', cmap='viridis')
plt.colorbar(im, label='网格内粒子数')
ax.set_xlabel('X坐标')
ax.set_ylabel('Y坐标')

def update(frame):
    im.set_data(density[frame])
    ax.set_title(f'时间步 {frame+1}/{T}')
    return [im]

# 创建动画,interval控制帧间隔(毫秒)
ani = FuncAnimation(fig, update, frames=T, interval=200, blit=True)
plt.show()

备选:直接绘制粒子实时位置

如果不需要统计网格密度,只想在Meshgrid背景上展示粒子位置:

fig, ax = plt.subplots(figsize=(8, 6))
# 画出Meshgrid网格线
ax.grid(True, which='both', color='gray', linestyle='--', alpha=0.5)
ax.set_xlim(a, b)
ax.set_ylim(a, b)

# 初始化粒子点对象
particles, = ax.plot([], [], 'ro', markersize=4, alpha=0.7)
ax.set_xlabel('X坐标')
ax.set_ylabel('Y坐标')

def update(frame):
    # 获取当前时间步的所有粒子位置
    current_x = particle_positions[frame, :, 0]
    current_y = particle_positions[frame, :, 1]
    particles.set_data(current_x, current_y)
    ax.set_title(f'时间步 {frame+1}/{T}')
    return [particles]

ani = FuncAnimation(fig, update, frames=T, interval=200, blit=True)
plt.show()

关键提示

  • 若粒子坐标超出[a, b]范围,可根据需求选择过滤、截断到网格边界,或者扩展Meshgrid范围。
  • 粒子数量较多时,网格密度图比直接画粒子更能清晰展示分布趋势,避免点重叠。
  • 调整interval参数可以改变动画播放速度,数值越小播放越快。

内容的提问来源于stack exchange,提问作者Fizza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:15:29