Как мы можем построить трехмерное изображение для среднего значения трехмерного вектора, изменив 2 элемента в python3? - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу построить z = (x + y + 1)/3 в python3, используя 3d capabilituy. Домены x и y являются целыми числами и находятся в диапазоне более 30 целых точек в [0,29]. Сейчас я сталкиваюсь с двумя проблемами:

  1. Размеры x, y и z должны быть одинаковыми ... На самом деле, мне нужно 30 баллов для xи y, тогда как 30 * 30 = 900 баллов за z. Чтобы составить график, мне нужно увеличить количество точек данных x и y до 900. Как мне сохранить их 30 при успешном построении?

  2. Как реализовано отображение (x, y, z)? Я не уверен, что текущая моя реализация успешно показывает результат. Это потому, что я не очень хорошо понимаю, как z отображается парой (x,y). Является ли моя реализация правильной?

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def my_mean(l):
  k = len(l)
  s = 0.0
  for elem in l:
    s = s + elem
  return s / k


if __name__ == "__main__" :
  N = 30
  x = np.linspace(1, 30, N*N) # I want to make this length 30
  y = np.linspace(1, 30, N*N) # this as well...
  constants = [1] * N*N
  z = []

  for i in range(0, N):
    for j in range(0, N):
      vec = {x[i], y[j], constants[i + N*j]}
      z.append(my_mean(vec)) # is this correct??

  fig = plt.figure()
  ax = fig.add_subplot(111, projection='3d')

  ax.scatter3D(x, y, z, label ="Mean")
  ax.set_title("Scatter Plot of Mean")

  ax.set_xlabel('x')
  ax.set_ylabel('y')
  ax.set_zlabel('z')
  ax.legend()

  plt.show()                                                                                                                                                                                                                  

1 Ответ

0 голосов
/ 07 ноября 2019

Посмотрите на функцию NumPy meshgrid. Для двух векторов x и y он создает двумерные координатные массивы, которые затем можно использовать в векторизованных вычислениях.

Чтобы ответить на ваш вопрос: да, фактически, ваши фактические x иy (также) должны быть 30 x 30 массивами, но, как указано выше, meshgrid правильно сгенерирует их для вас, используя ваши начальные векторы длины 30.

Это было бы моим (сокращенный) код:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

N = 30
x = np.linspace(1, 30, N)
y = np.linspace(1, 30, N)

xx, yy = np.meshgrid(x, y)
z = (xx + yy + 1) / 3

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter3D(xx, yy, z, label="Mean")
ax.set_title("Scatter Plot of Mean")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.legend()
plt.show()

Вывод:

Output

Надеюсь, что поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...