2016-12-21 2 views
0

Есть ли способ Проходной этого кортежа, где левая массива являются позиции в массиве, а правый массив значение, которое я хотел бы вставить в заданных позициях:Есть ли способ перебрать возвращаемое значение np.where? (?)

(array([ 0, 4, 6, ..., 9992, 9996, 9997]), array([3, 3, 3, ..., 3, 3, 3])) 

Выходной сигнал выше генерируется из следующего фрагмента кода:

np.where(h2 == h2[i,:].max())[1] 

Я хотел бы результат быть похожим на это:

array[0] = 3 
array[4] = 3 
... 
array[9997] = 3 

ответ

2

Просто используйте простую индексацию:

indices, values = my_tuple 

array[indices] = values 

Если вы не окончательный массив еще вы можете создать его, используя функцию желания как np.zeros, np.ones и т.д. с размером как размер максимального индекса.

1

Я думаю, что вы хотите transpose из where кортежа:

In [204]: x=np.arange(1,13).reshape(3,4) 
In [205]: x 
Out[205]: 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12]]) 
In [206]: idx=np.where(x) 
In [207]: idx 
Out[207]: 
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32), 
array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int32)) 
In [208]: ij=np.transpose(idx) 
In [209]: ij 
Out[209]: 
array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3], 
     [2, 0], 
     [2, 1], 
     [2, 2], 
     [2, 3]], dtype=int32) 

На самом деле есть функция, которая делает только что:

np.argwhere(x) 

перебора на ij, я могу напечатать:

In [213]: for i,j in ij: 
    ...:  print('array[{}]={}'.format(i,j)) 
    ...:  
array[0]=0 
array[0]=1 
array[0]=2 

zip(*) - это список версия транспонирования:

for i,j in zip(*idx): 
    print(i,j) 
Смежные вопросы