Дискретизации N-мерной линии


У меня есть линия, проживающего в некоторые n-мерного пространства, которая должна быть дискретизированы на набор очков. Учитывая start, end точек, и некоторые количество очков r что нужно, я могу сделать это следующим образом:

import numpy as np

start, end = (0, 0, 0), (10, 10, 10)
r = 3
dl = zip(*[np.linspace(s_i, e_i, r) for s_i, e_i in zip(start, end)])

Это, кажется, работает достаточно хорошо, но я бы лучше все это работать как генератор, и сейчас сейчас linspace должен быть рассчитан на весь урок. Как я могу достичь этого?



148
1
задан 19 февраля 2018 в 08:02 Источник Поделиться
Комментарии
2 ответа

И NumPy работает лучше, если вы представляете все ваши данные в единые массивы. Затем вы можете векторизовать операций: то есть, организовать для каждой операции, чтобы выполнить равномерно по всем элементам массива. Это позволяет numpy для делегирования операций для быстрого собственный код дистанционного.

Предполагая, что эти соображения относятся к вашему делу, то вы должны преобразовать ваш вклад в массивы numpy:

>>> start = np.array((0, 0, 0))
>>> end = np.array((10, 10, 10))
>>> r = 3

а затем построить массив точек вдоль линии:

>>> start + np.linspace(0, 1, r)[..., np.newaxis] * (end - start)
array([[ 0., 0., 0.],
[ 5., 5., 5.],
[10., 10., 10.]])

2
ответ дан 20 февраля 2018 в 09:02 Источник Поделиться

Это типа вещь, которая должна быть в функцию для повторного использования. Также, как Гарет указал, есть смысл возвращать результат в виде 2D массива, а не повторяемое 1-мерных массивов, а это, вероятно, будет быстрее. Кроме того, мы могли бы также убедиться в том, что начальная и конечная точки имеют одинаковую размерность, чтобы предотвратить странные ошибки выскакивают.

import numpy as np
def discretize(start, end, length):
assert len(start)==len(end)
ans = np.empty((len(start),length))
for row, s_i, e_i in zip(range(len(start)),start, end):
ans[row]=np.linspace(s_i, e_i, length)
return ans

0
ответ дан 20 февраля 2018 в 06:02 Источник Поделиться