Индексы, в которых значения в массиве встречаются в другом массиве - PullRequest
0 голосов
/ 09 мая 2020

у меня есть этот массив:

n=nodes of the graph
a=np.random.choice(n,size=3)
prob=np.zeros((1,n))

как я могу назначить узлы в a на prob на основе индекса узла? У меня есть этот код:

for k in a:
    m=nodes.index(k)
    b=np.zeros((1,n))
    b[0][m]=1
here the results

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

но для меня я хочу получить этот результат

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

любая помощь будет оценена

1 Ответ

2 голосов
/ 09 мая 2020

Вы сбрасываете 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...