Я бы хотел чередовать несколько массивов с разными размерами вдоль определенной оси.В частности, у меня есть список массивов формы (_, *dims)
, изменяющихся вдоль первой оси, которые я хотел бы чередовать, чтобы получить другой массив формы (_, *dims)
.Например, при вводе
a1 = np.array([[11,12], [41,42]])
a2 = np.array([[21,22], [51,52], [71,72], [91,92], [101,102]])
a3 = np.array([[31,32], [61,62], [81,82]])
interweave(a1,a2,a3)
желаемый результат будет
np.array([[11,12], [21,22], [31,32], [41,42], [51,52], [61,62], [71,72], [81,82], [91,92], [101,102]]
С помощью предыдущих сообщений (таких как Numpy concatenate массивов с чередованием )Я получил эту работу, когда массивы совпадают по первому измерению:
import numpy as np
def interweave(*arrays, stack_axis=0, weave_axis=1):
final_shape = list(arrays[0].shape)
final_shape[stack_axis] = -1
# stack up arrays along the "weave axis", then reshape back to desired shape
return np.concatenate(arrays, axis=weave_axis).reshape(final_shape)
К сожалению, если входные фигуры не совпадают по первому измерению, вышеприведенное выдает исключение, так как мы должны объединить по другой осичем несоответствующий.В самом деле, я не вижу никакого способа эффективно использовать конкатенацию здесь, поскольку конкатенация вдоль несоответствующей оси уничтожит информацию, необходимую для получения желаемого результата.
Еще одна идея, которая у меня была, заключалась в том, чтобы заполнить входные массивыпустые записи, пока их формы не совпадут по первому измерению, а затем удалите пустые записи в конце дня.Хотя это сработало бы, я не уверен, как лучше всего это реализовать, и, похоже, в первую очередь это не нужно.