Сортировка данных для печати в mplot3d - PullRequest
3 голосов
/ 19 ноября 2010

Я использовал mplot3d (часть matplotlib) для некоторых различных трехмерных графиков, и он выполнял работу превосходно.Однако я столкнулся с новой проблемой.

Mplot3d ожидает, что данные будут отсортированы определенным образом для построения каркаса.Например, ему нравится что-то вроде этого:

x = array([[1, 2, 3],
          [1, 2, 3],
          [1, 2, 3]])

y = array([[1, 1, 1],
          [2, 2, 2],
          [3, 3, 3])

, где z - это массив тех же измерений с данными, соответствующими каждой из этих позиций в пространстве.

К сожалению, мои данныене отформатирован так - все остальные строки переворачиваются, потому что данные собираются путем сканирования по растровому шаблону.

Итак, у меня есть что-то похожее на:

x = array([[1, 2, 3],
          [3, 2, 1],
          [1, 2, 3]])

Мой текущий подходэто очень уродливо, грубо говоря, «сделай цикл for, затем проверь, если ты в нечетной строке или нет», который строит новый массив из старого, но я надеюсь, что есть более элегантный способ сделать это,Сложность состоит в том, что мне нужно переставить массив Z таким же образом, как я делаю X и Y, чтобы гарантировать, что данные, соответствующие каждой точке, сохраняют пространство.

В идеале, я быкак что-то надежное и специально разработанное для сортировки набора двумерных массивов, которые содержат произвольные точки случайного положения, но даже более питонный способ сделать то, что я уже делаю, был бы оценен.Если бы я мог сделать его более надежным и не зависеть от этого конкретного шаблона растрового сканирования, это, вероятно, избавило бы меня от головной боли в долгосрочной перспективе.

1 Ответ

2 голосов
/ 19 ноября 2010

Если я вас правильно понимаю, вы просто хотите сделать это: x[1::2, :] = x[1::2, ::-1].

Есть несколько изломов ... Если вы не сделаете промежуточную копию x, она не вполне делает то, что вы ожидаете, из-за того, как вещание работает в numpy.

Тем не менее, сделать базовую индексацию довольно просто:

import numpy as np
x = np.array([[1,2,3],[3,2,1],[1,2,3],[3,2,1],[1,2,3]])
x_rev = x.copy()
x_rev[1::2, :] = x[1::2, ::-1]

Это преобразует это (x):

array([[1, 2, 3],
       [3, 2, 1],
       [1, 2, 3],
       [3, 2, 1],
       [1, 2, 3]])

В это (x_rev):

array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

В случае, если вы не знакомы с нарезкой в ​​python, x[1::2] выберет все остальные элементы x, начиная со второго элемента. (1 - это начальный индекс, 2 - это приращение). Напротив, x[::-1] просто указывает приращение -1, что приводит к обращению массива в обратном направлении. В этом случае мы применяем эти срезы только к определенной оси, поэтому мы можем выбрать и повернуть все остальные строки, начиная со второй строки.

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