"как из" в NumPy - PullRequest
       71

"как из" в NumPy

7 голосов
/ 05 мая 2011

Я ищу способ реализации оператора "как" в numpy. В частности, если:

  1. t1 - n -вектор меток времени в строго возрастающем порядке;
  2. d1 является n x p матрицей наблюдений, с i -ой строкой, соответствующей t1[i];
  3. t2 в m -векторе временных меток, также в строго возрастающем порядке;

Мне нужно создать матрицу m x p d2, где d2[i] - это просто d1[j] для наибольшего значения j, такого, что t1[j] <= t2[i].

Другими словами, мне нужно получить строки d1 с отметок времени в t2.

Легко написать это на чистом Python, но мне интересно, есть ли способ избежать интерпретируемых циклов (n, m и p довольно большие).

Временные метки: datetime.datetime объектов. Наблюдения являются значениями с плавающей точкой.

edit : Для записей, где t1[j] <= t2[i] не может быть удовлетворено (т. Е. Когда отметка времени в t2 предшествует всем отметкам времени в t1), в идеале я хотел бы получить строки NaN с.

1 Ответ

11 голосов
/ 05 мая 2011

Ваш лучший выбор: numpy.searchsorted():

d1[numpy.searchsorted(t1, t2, side="right") - 1]

Это будет искать индексы, где значения t2 должны быть вставлены в t1 для поддержания порядка,Биты side="right" и - 1 предназначены для обеспечения точно указанного поведения.

Редактировать : Чтобы получить строки из NaN, в которых условие t1[j] <= t2[i] не может быть выполнено, вы можетеиспользуйте

nan_row = numpy.repeat(numpy.nan, d1.shape[1])
d1_nan = numpy.vstack((nan_row, d1))
d2 = d1_nan[numpy.searchsorted(t1, t2, side="right")]
...