← Назад к вопросам

Как представить массив numpy с координатами XYZ, если каждая тройка значений образует одну точку в пространстве?

1.8 Middle🔥 131 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Представление массива NumPy с координатами XYZ

Для эффективного хранения и обработки 3D координат в NumPy существует несколько подходов, каждый с собственными преимуществами.

Основные способы

1. Двумерный массив формы (N, 3)

Это наиболее естественный и рекомендуемый подход. Каждая строка содержит координаты одной точки:

import numpy as np

# Создание массива из 5 точек
points = np.array([
    [1.0, 2.0, 3.0],  # точка 1
    [4.0, 5.0, 6.0],  # точка 2
    [7.0, 8.0, 9.0],  # точка 3
    [10.0, 11.0, 12.0],  # точка 4
    [13.0, 14.0, 15.0],  # точка 5
])

print(points.shape)  # (5, 3)
print(points[0])     # [1. 2. 3.]

Преимущества:

  • Интуитивно понятное представление
  • Стандартное соглашение в научных библиотеках (scikit-learn, scipy)
  • Легко извлечь отдельные точки: points[i]
  • Оптимально для операций с каждой точкой отдельно

2. Структурированный массив

Для именованного доступа к компонентам:

# Определение типа данных со строго названными полями
dt = np.dtype([("x", np.float64), ("y", np.float64), ("z", np.float64)])
points_structured = np.array([
    (1.0, 2.0, 3.0),
    (4.0, 5.0, 6.0),
    (7.0, 8.0, 9.0),
], dtype=dt)

print(points_structured["x"])  # [1. 4. 7.]
print(points_structured[0]["y"])  # 2.0

Преимущества:

  • Читаемый код с именованным доступом
  • Удобно для больших структур данных с множеством параметров

3. Отделённые одномерные массивы

Иногда удобно хранить координаты отдельно:

x = np.array([1.0, 4.0, 7.0])
y = np.array([2.0, 5.0, 8.0])
z = np.array([3.0, 6.0, 9.0])

# Объединение в нужный момент
points = np.column_stack((x, y, z))  # форма (3, 3)

Преимущества:

  • Хороша для обработки отдельных координат
  • Экономит память при операциях только с одной осью

Практические операции

Вычисление расстояний между точками:

# Евклидово расстояние первой точки до всех остальных
point = points[0]
distances = np.sqrt(np.sum((points - point) ** 2, axis=1))
print(distances)

Применение трансформаций:

# Масштабирование всех координат
scaled = points * 2.0

# Сдвиг всех точек
translated = points + np.array([10.0, 20.0, 30.0])

# Нормализация (приведение к длине 1)
norms = np.linalg.norm(points, axis=1, keepdims=True)
normalized = points / norms

Фильтрация точек:

# Выбрать точки, где x > 5
mask = points[:, 0] > 5
filtered = points[mask]

# Выбрать точки ближе определённого расстояния от начала координат
dist_from_origin = np.linalg.norm(points, axis=1)
close_points = points[dist_from_origin < 10]

Рекомендации

  • Для большинства случаев используй форму (N, 3) — это стандарт в экосистеме NumPy
  • Если нужен именованный доступ и производительность критична, используй структурированные массивы
  • Хранение в отдельных массивах оправданно только при специфических операциях с одной осью
  • Всегда убеждайся, что axis=1 при агрегирующих операциях для правильной обработки координат

Такой подход обеспечивает читаемость, производительность и совместимость с остальными библиотеками научного стека Python.

Как представить массив numpy с координатами XYZ, если каждая тройка значений образует одну точку в пространстве? | PrepBro