У меня есть 1-й массив, где у меня есть образец в энтери.Я приведу пример.В массиве arr
у меня есть первые 4 записи с одной цифрой, следующие 4 записи с двумя цифрами, а затем следующие 6 записей с 3 цифрами.( Эта единичная, двузначная, тройная цифра предназначена только для выделения шаблона. Фактический массив имеет числа с плавающей запятой с одинаковыми значениями). Пример 1-го массива выглядит следующим образом:
import numpy as np
arr = np.array([1, 2, 3, 4, 11, 12, 13, 14, 111, 123, 132, 145, 176, 129,
6, 5, 3, 2, 21, 82, 53, 34, 121, 133, 139, 165, 186, 119])
Теперь у одного полного шаблона всего 4 + 4 + 6 = 14 единиц.Этот шаблон (или повторяющаяся единица) повторяется несколько сотен тысяч раз, поэтому длина моего массива кратна 14 (14 * 2 = 28 в примере arr
выше).
Вопрос:
Я хочу извлечь все однозначные записи (первые 4 числа одной повторяющейся единицы), все двухзначные записи (следующие 4 числа одногоповторяющаяся единица) и все трехзначные записи (следующие 6 цифр одной повторяющейся единицы).
Таким образом, я хочу разделить мои большие arr
на три 1-мерных массива.Таким образом, желаемый результат равен
arr1 = array([1, 2, 3, 4, 6, 5, 3, 2])
arr2 = array([11, 12, 13, 14, 21, 82, 53, 34])
arr3 = array([111, 123, 132, 145, 176, 129, 121, 133, 139, 165, 186, 119])
Моя идея
Одним из способов может быть просто reshape
его в 2d массив, так как я знаюколичество повторений (= 28/14 = 2 в примере arr
), а затем используйте индексацию, чтобы получить все первые куски 4, 4 и 6, а затем concatenate
.
arr = arr.reshape(2, 14)
, а затем использовать нарезку, чтобы получить куски как
arr1 = np.concatenate(arr[:, 0:4])
arr2 = np.concatenate(arr[:, 4:8])
arr3 = np.concatenate(arr[:, 8:])
print (arr1, arr2, arr3)
# array([1, 2, 3, 4, 6, 5, 3, 2]),
# array([11, 12, 13, 14, 21, 82, 53, 34]),
# array([111, 123, 132, 145, 176, 129, 121, 133, 139, 165, 186, 119]))
Но мне интересно узнать альтернативное и эффективное решение, использующее какое-то маскирование и нарезка без преобразования сначала в 2-й массив.