Мне пришлось запустить ваш код, чтобы увидеть, что он на самом деле произвел. Есть пределы тому, что я могу «запустить» в своей голове.
In [230]: c
Out[230]:
array([[1., 2., 0., 0.],
[4., 2., 6., 0.],
[5., 0., 0., 0.]])
In [231]: counts
Out[231]: {0: 2, 1: 3, 2: 1}
Пропуск этой информации может задержать возможные ответы. «Векторизация» требует мышления в терминах целого массива, что проще всего, если я могу визуализировать результат и искать шаблон.
Это похоже на проблему padding
.
In [260]: u, c = np.unique(a, return_counts=True)
In [261]: u
Out[261]: array([0, 1, 2])
In [262]: c
Out[262]: array([2, 3, 1]) # cf with counts
Загрузка данных со строками разных размеров в Numpy массив
Работая из предыдущих вопросов о заполнении, я могу создать маску:
In [263]: mask = np.arange(4)<c[:,None]
In [264]: mask
Out[264]:
array([[ True, True, False, False],
[ True, True, True, False],
[ True, False, False, False]])
и использовать ее для присвойте b
значения c
:
In [265]: c = np.zeros((3,4),int)
In [266]: c[mask] = b
In [267]: c
Out[267]:
array([[1, 2, 0, 0],
[4, 2, 6, 0],
[5, 0, 0, 0]])
Поскольку a
уже отсортировано, мы можем получить счет быстрее, чем с unique
. Также у него будут проблемы, если a
не имеет значений для некоторых строк.