2013-11-16 2 views
2

Я использую np.nonzero() и я не понимаю возвращенияКак я могу получить позицию ненулевых значений в массиве numpy?

Я стараюсь

for groupPosition in np.nonzero(groupMatrix): 
    print groupPosition 

и вернуться [0 1 0 2 3 3 3]

for groupPosition in zip(np.nonzero(groupMatrix)): 
    print groupPosition 

и возврат (массив ([0, 1, 0, 3, 0, 1, 3]),)

groupMatrix:

[[ 1. 1. 0. 0.] 
[ 1. 0. 0. 0.] 
[ 0. 0. 0. 2.] 
[ 3. 3. 0. 2.]] 

Но не вернуть позиции, как (0, 0)

ответ

3
>>> import numpy as np 
>>> 
>>> groupMatrix = np.array([ 
...  [1, 1, 0, 0], 
...  [1, 0, 0, 0], 
...  [0, 0, 0, 2], 
...  [3, 3, 0, 2] 
... ]) 
>>> np.nonzero(groupMatrix) 
(array([0, 0, 1, 2, 3, 3, 3], dtype=int64), array([0, 1, 0, 3, 0, 1, 3], dtype=int64)) 
>>> zip(np.nonzero(groupMatrix)) 
[(array([0, 0, 1, 2, 3, 3, 3], dtype=int64),), (array([0, 1, 0, 3, 0, 1, 3], dtype=int64),)] 

Использование zip(*...):

>>> zip(*np.nonzero(groupMatrix)) 
[(0, 0), (0, 1), (1, 0), (2, 3), (3, 0), (3, 1), (3, 3)] 

zip(*a), как zip(a[0], a[1], ...)

>>> a = [(0, 1, 2), (3, 4, 5)] 
>>> zip(a) 
[((0, 1, 2),), ((3, 4, 5),)] 
>>> zip(a[0], a[1]) 
[(0, 3), (1, 4), (2, 5)] 
>>> zip(*a) 
[(0, 3), (1, 4), (2, 5)] 

См Unpacking Argument Lists.

+0

whoah, просто ответил после вас, хороший ответ. –

+0

именно то, что я хочу! Спасибо! @GamesBrainiac спасибо за внимание – user2997534

1

Попробуйте следующее:

import numpy as np 

var = [ 
    [1.0, 1.0, 0.0, 0.0], 
    [1.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 2.0], 
    [3.0, 3.0, 0.0, 2.0] 
] 

rows, cols = np.nonzero(var) 

for r, c in zip(rows, cols): 
    print var[r][c] 

Returns:

1.0 
1.0 
1.0 
2.0 
3.0 
3.0 
2.0 

Вы получаете результаты, которые вы получаете потомуnp.nonzero возвращает кортеж, так как ваш массив имеет 2 размеров, он имеет два массивы. Теперь каждый из этих массивов необходимо использовать вместе, поэтому в моем примере функция возвращает номер строки, а затем номер столбца. Давайте посмотрим смотрите:

>>> import numpy as np 
>>> var = [ 
    [1.0, 1.0, 0.0, 0.0], 
    [1.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 2.0], 
    [3.0, 3.0, 0.0, 2.0] 
] 
>>>     
>>> non_zeroes = np.nonzero(var) 
>>> non_zeroes 
(array([0, 0, 1, 2, 3, 3, 3]), array([0, 1, 0, 3, 0, 1, 3])) 

Если мы внимательно посмотрим, мы можем видеть, что var[0][0] действительно не равен нулю. так и var[3][3]. Тем не менее, вы не увидите 2 в первом кортеже, а другой 2 по соответствующему индексу.

Смежные вопросы