Если вам нужен плотный массив, мы теряем эффективность использования памяти и, следовательно, производительность -
эффективный способ создания матрицы вхождений из двух массивов, которые содержат индексы, один представляетиндексы строк в этой матрице, другие, столбцы.
например. У меня есть:
#matrix will be size 4x3 in this example
#array of rows idxs, with values from 0 to 3
[0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3]
#array of columns idxs, with values from 0 to 2
[0, 1, 1, 1, 2, 2, 0, 1, 2, 0, 2, 2, 2, 2]
И нужно создать матрицу вхождений вроде:
[[1 0 0]
[0 2 0]
[0 1 2]
[2 1 5]]
Я могу создать массив из горячих векторов в простой форме, но не могу заставить его работать, когда существует более одного вхождения:
n_rows = 4
n_columns = 3
#data
rows = np.array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3])
columns = np.array([0, 1, 1, 1, 2, 2, 0, 1, 2, 0, 2, 2, 2, 2])
#empty matrix
new_matrix = np.zeros([n_rows, n_columns])
#adding 1 for each [row, column] occurrence:
new_matrix[rows, columns] += 1
print(new_matrix)
Который возвращает:
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 1. 1.]
[ 1. 1. 1.]]
Кажется, что индексирование и добавление такого значения не работает, когда существует более одного вхождения / индекса, кроме печати, кажется, работает нормально:
print(new_matrix[rows, :])
:
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 1. 0.]
[ 0. 1. 1.]
[ 0. 1. 1.]
[ 0. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
Так может я что-то там упускаю? Или это не может быть сделано, и мне нужно искать другой способ сделать это?