Вы можете использовать функцию reshape из numpy с небольшим количеством индексации:
a = np.arange(24)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
Используя изменение формы и немного индексации:
a = a.reshape((8,3))
idx = np.arange(2)
idx = np.concatenate((idx,idx+4))
idx = np.ravel([idx,idx+2],'F')
b = a[idx,:].reshape((4,6))
Ouptut :
>>> b
array([[ 0, 1, 2, 6, 7, 8],
[ 3, 4, 5, 9, 10, 11],
[12, 13, 14, 18, 19, 20],
[15, 16, 17, 21, 22, 23]])
Здесь кортеж (4,6)
, переданный для изменения формы, указывает, что вы хотите, чтобы ваш массив был двухмерным и имел 4 массива из 6 элементов. Эти значения могут быть вычислены. Затем мы вычисляем индекс, чтобы установить правильный порядок данных. Обвисулы, это сложный момент здесь. Поскольку я не уверен, что вы подразумеваете под «данными любого размера», мне трудно дать вам простой способ вычисления этого индекса.
Очевидно, что если вы используете список, а не массив np.ar вам может понадобиться сначала преобразовать список, например, используя np.array(your_list)
.
Редактировать :
Я не уверен, что это именно то, что вам нужно, но это должно работать для любого массива, равномерно делимого на 6:
def custom_order(size):
a = np.arange(size)
a = a.reshape((size//3,3))
idx = np.arange(2)
idx = np.concatenate([idx+4*i for i in range(0,size//(6*2))])
idx = np.ravel([idx,idx+2],'F')
b = a[idx,:].reshape((size//6,6))
return b
>>> custom_order(48)
array([[ 0, 1, 2, 6, 7, 8],
[ 3, 4, 5, 9, 10, 11],
[12, 13, 14, 18, 19, 20],
[15, 16, 17, 21, 22, 23],
[24, 25, 26, 30, 31, 32],
[27, 28, 29, 33, 34, 35],
[36, 37, 38, 42, 43, 44],
[39, 40, 41, 45, 46, 47]])