Как построить квадратную, прямоугольную, шестнадцатеричную 2D поверхность, используя метод массива вместо ‘for loop’?

#python #numpy #matplotlib

#python #numpy #matplotlib

Вопрос:

Я ищу общий код, который отображает квадратную, прямоугольную, шестиугольную 2D-поверхность, используя исходную матрицу 2×2.

Ниже приведен код, который я хотел исключить из «for loop» и вместо этого использовать более простой метод массива с использованием numpy. На более широкой картинке у меня есть 8 «for loop», что значительно замедлит работу моей программы.

 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()
  

введите описание изображения здесь

Спасибо за любую помощь.

Комментарии:

1. Для начала работает ли одна команда построения вне цикла? plt.scatter(x, y, s=6, color='Blue') . То есть построить целые массивы с помощью одного вызова, а не по одной точке за раз.

Ответ №1:

Вы могли бы создать 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()
  

пример построения