首页 > 解决方案 > 如何使用数组方法而不是“for循环”绘制正方形、矩形、十六进制二维曲面?

问题描述

我正在寻找使用初始 2x2 矩阵绘制正方形、矩形、六边形 2D 表面的通用代码。

以下是我想消除'for循环'的代码,而是使用numpy的更简单的数组方法。从更大的角度来看,我有 8 个“for 循环”,这将显着减慢我的程序。

import numpy as np
import math
import matplotlib.pyplot as plt


l= 10 #loop limits
lmit=5#plot limits

# 2x2 matrix
a = [-0.5, 1];
b = [1.00, 0.00];

# variable define
x = np.zeros((2*l, 2*l))
y = np.zeros((2*l, 2*l))

fig = plt.figure()
for i in range(-l, l):
    for k in range(-l, l):
        x[i + l, k + l] = (i * a[0] + k * b[0]);
        y[i + l, k + l] = (i * a[1] + k * b[1]);
        plt.scatter(x[i + l, k + l], y[i + l, k + l], s=6, color='Blue')


plt.ylim(-lmit, lmit)
plt.xlim(-lmit, lmit)
plt.show()

在此处输入图像描述

谢谢你的帮助。

标签: pythonnumpymatplotlib

解决方案


您可以创建一个meshgrid并使用 numpy 的广播。(请注意,在 Python 中,行不应以分号结尾,有时 Jupyter 块中的最后一个命令除外。)

import numpy as np
import matplotlib.pyplot as plt

l = 10  # loop limits

# 2x2 matrix
a = [-0.5, 1]
b = [1.00, 0.00]

x0, y0 = np.meshgrid(np.arange(-l, l + 1), np.arange(-l, l + 1))
x1 = x0 * a[0] + y0 * b[0]
y1 = x0 * a[1] + y0 * b[1]

plt.scatter(x1, y1, s=6, color='navy')
plt.show()

示例图


推荐阅读