Python如何生成两个数组的所有组合并实现3D绘图展示
需求1:生成两个列表元素的所有可能组合
使用numpy.meshgrid()即可快速实现,该方法会将两个一维数组扩展为维度匹配的二维网格,网格对应位置的元素就是一组(x,y)配对,覆盖所有组合:
# 生成50*50的二维网格,覆盖所有x和y的配对 X_grid, Y_grid = np.meshgrid(x_interval, y_interval) # 如果需要把所有组合展开为「每行一组(x,y)」的二维列表,可补充以下代码 all_pairs = np.column_stack((X_grid.ravel(), Y_grid.ravel())) # 输出为2500行2列的数组,包含全部50*50的组合
需求2:所有组合计算结果的三维图展示
可以通过matplotlib自带的3D绘图接口实现,先对所有网格点计算输出值,再绘制曲面/散点图即可。基于你提供的代码逻辑调整后的完整可运行版本如下:
import numpy as np from scipy.interpolate import barycentric_interpolate import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def func(x,y): return 2*np.array(x) - np.array(y)**2 lower_x, upper_x = 100,150 lower_y, upper_y = 0.5,1. x_interval = np.arange(lower_x, upper_x,1) #X y_interval = np.arange(lower_y, upper_y,0.01) #Y x1 = np.linspace(lower_x, upper_x,7) x2 = np.linspace(lower_y, upper_y,7) # 适配单组(x,y)输入的计算函数,逻辑和你原代码完全一致 def calc_single_point(x, y): idx_x = np.argmin(np.abs(x_interval - x)) idx_y = np.argmin(np.abs(y_interval - y)) # 计算res_1对应值 res_1 = barycentric_interpolate(x2, func(x, x2), y_interval)[idx_y] # 计算output对应值 res_tot = [func(xi, x2)[np.argmin(np.abs(x1 - xi))] for xi in x1] output = barycentric_interpolate(x1, res_tot, x_interval)[idx_x] return res_1 - output * x # 生成网格+批量计算所有组合的结果 X_grid, Y_grid = np.meshgrid(x_interval, y_interval) vector_calc = np.vectorize(calc_single_point) Z_grid = vector_calc(X_grid, Y_grid) # 绘制三维曲面图 fig = plt.figure(figsize=(10,7)) ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(X_grid, Y_grid, Z_grid, cmap='viridis', edgecolor='none') ax.set_xlabel('X值') ax.set_ylabel('Y值') ax.set_zlabel('计算结果') fig.colorbar(surf, shrink=0.5, aspect=5) plt.show()
如果偏好散点展示,只需要把绘图部分的plot_surface替换为以下代码即可:
ax.scatter(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel(), c=Z_grid.ravel(), cmap='viridis', s=5)
内容的提问来源于stack exchange,提问作者John_maddon
相关产品推荐
相关产品推荐

