Вы сбрасываете b
на каждой итерации, вам нужно инициализировать b
перед for
l oop и , затем обновить b
в каждом с результатом m
. Также обратите внимание, что для b
требуется только 1 ось. Рассмотрим, например, следующий список узлов и массив a
узлов, который мы будем использовать для поиска позиции в nodes
:
nodes = [5,12,6,1,3,9,4,8,2,45]
a = np.array([5, 9, 8, 4])
Адаптировав ваш подход, вы получите:
b=np.zeros(len(nodes))
for k in a:
m=nodes.index(k)
b[m]=1
print(b)
# array([1., 0., 0., 0., 0., 1., 1., 1., 0., 0.])
Обратите внимание, что это имеет ненужную O(len(nodes)*len(a))
сложность. Лучшим подходом было бы создать значение сопоставления таблицы поиска с позициями в nodes
и присвоить b
как:
d = {v:k for k,v in enumerate(nodes)}
b=np.zeros(len(nodes))
for k in a:
b[d[k]] = 1
print(b)
#array([1., 0., 0., 0., 0., 1., 1., 1., 0., 0.])
Кроме того, поскольку вы используете numpy, мы можно ускорить вышеуказанное, используя np.searchsorted
с np.bincount
:
nodes = np.array(nodes)
nodes_s = nodes.argsort()
s = np.searchsorted(nodes[nodes_s],a)
b = np.bincount(nodes_s[s], minlength=len(nodes))
print(b)
# array([1, 0, 0, 0, 0, 1, 1, 1, 0, 0])