Нарезка каждого 5-го и 6-го элементов из вектора-строки numpy - PullRequest
2 голосов
/ 06 мая 2020

У меня есть такой массив: A = ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]), и я хотел бы извлечь каждый 5-й и 6-й элементы из этого вектора-строки, что приведет к B = ([4,5,9,10,14,15]).

Я знаю, как извлечь каждый 5-й элемент: B = A[::5], но не знаю, как извлекать два значения одно за другим.

Ответы [ 4 ]

0 голосов
/ 06 мая 2020

Вы можете построить маску и использовать маску для извлечения элементов:

mask = (np.arange(len(A))%6 == np.array([[4],[5]])).any(0)
A[mask]
# array([ 4,  5, 10, 11, 16])
0 голосов
/ 06 мая 2020

В одну сторону с использованием numpy:

import numpy as np
A = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])

ids = np.ravel(np.array([np.array([4,5]) + i * np.array([5,5]) for i in range(3)] ))

A[ids]
array([ 4,  5,  9, 10, 14, 15])
0 голосов
/ 06 мая 2020

Вы написали каждый 5-й и 6-й элемент , поэтому я расшифровываю это следующим образом:

  • делим исходный ряд на «части», 6 элементы каждый,
  • из каждой «части» берут 2 последних элемента (5-й и 6-й).

Итак, ожидаемый результат (немного отличается от того, что вы написали):

  • 4 и 5 - 2 последних элемента из части 0 через 5 ,
  • 10 и 11 - 2 последних элемента из части 6 через 11 ,
  • 16 - из третьей части ( 12 через 17 ) берем только 16 , т.к. исходник Серия не содержит 17 .

Чтобы получить только эти элементы, вы можете запустить:

pd.concat([s[4::6], s[5::6]]).sort_index().tolist()

Подробности:

  • s[4::6] - каждые 6 -й элемент начиная с 5-го (обратите внимание, что индексация начинается с 0 ),
  • s[5::6] - каждый 6-й элемент начиная с 6-го.
  • concat(...) - объединить эти 2 результата,
  • sort_index() - восстановить исходный порядок (при условии, что источник Series имеет упорядоченный индекс),
  • tolist() - преобразовать приведенный выше результат (a Series ) в обычный list .

Для вашего образца данных результат будет:

[4, 5, 10, 11, 16]

Другое возможное решение , на этот раз основанное на разделении источника Серии на части размером 6 и взятии элемента № 5 и 6 (если есть) из каждой части:

np.concatenate([ tt[4:] for tt in np.array_split(s.values, np.ceil(s.size / 6)) ]).tolist()
0 голосов
/ 06 мая 2020

Вы можете использовать:

A[4::5]

, чтобы получить array([ 4, 9, 14]), а затем объединить и отсортировать с A[::5].

...