Это перебирает сдвиги, а не строки (цикл размером 10):
N = 10
c = np.hstack([b[i:i-N] for i in range(N)])
Объяснение: b[i:i-N]
— это строки b
от i
до m-(N-i)
(исключая саму m-(N-i)
), где m
— количество строк в b
. Затем np.hstack
складывает эти выбранные подмассивы по горизонтали (стеки b[0:m-10]
, b[1:m-9]
, b[2:m-8]
,..., b[10:m]
) (как объясняет вопрос).
c.форма: (990, 20)
Также я думаю, что вы можете искать форму (991, 20), если хотите включить все окна.
вы также можете использовать шаги, но если вы хотите выполнять над ним операции, я бы не советовал этого делать, поскольку с ними сложно работать с памятью. Вот решение для шагов, если вы настаиваете:
from skimage.util.shape import view_as_windows
c = view_as_windows(b, (10,2)).reshape(-1, 20)
с.форма: (991, 20)
Если вам не нужна последняя строка, просто удалите ее, вызвав c[:-1]
.
Аналогичное решение применимо к функции as_strides numpy (в основном они работают одинаково, не уверен в их внутренностях).
ОБНОВЛЕНИЕ: если вы хотите найти уникальные значения и их частоты в каждой строке c
, вы можете сделать следующее:
unique_values = []
unique_counts = []
for row in c:
unique, unique_c = np.unique(row, return_counts=True)
unique_values.append(unique)
unique_counts.append(unique_c)
Обратите внимание, что массивы numpy должны быть прямоугольными, что означает, что количество элементов в каждой (размерной) строке должно быть одинаковым. Поскольку разные строки в c
могут иметь разное количество уникальных значений, вы не можете создать массив numpy для уникальных значений каждой строки (альтернативой было бы создание структурированного массива numpy). Поэтому решение состоит в том, чтобы создать список/массив массивов, каждый из которых включает уникальные значения разных строк в c. unique_values
— это список массивов уникальных значений, а unique_counts
— их частота в том же порядке.
person
Ehsan
schedule
11.05.2020