Как мы можем найти индексы, в которых значение `True` существует вдоль оси 1 в логическом массиве? - PullRequest
0 голосов
/ 18 мая 2019

Вот логический массив

In [102]: arr        
Out[102]: 
array([[0, 1, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 1]], dtype=uint8)

И я хочу вычислить индексы вдоль оси-1, где есть 1, и тут же остановиться, и перейти к следующему столбцу, пока я не исчерпаю все столбцы.Таким образом, ожидаемое решение было бы:

array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12])

Чтобы объяснить немного больше о том, как желаемый результат выше: мы начинаем со столбца 1 и спускаемся вдоль оси-1, и мы встречаемся с 1 по индексу 1, а затем снова по индексу 4 и так далее, пока мы не встретим последний 1 в этом столбце в позиции 6.Итак, мы останавливаемся там, пропуская оставшуюся часть столбца, потому что больше не будет 1 с, а затем переходим ко второму столбцу, где встречаемся 1 с индексом 0 и так далее, пока не исчерпаем все столбцы.Объединяя все индексы, которые мы собрали до сих пор, мы получим массив результатов.

У меня есть зацикленное решение, но я бы предпочел векторизованное.Как мы можем подойти к этому?Любые первоначальные идеи очень помогли бы.

Ответы [ 4 ]

2 голосов
/ 18 мая 2019
In [134]: arr=np.array([[0, 1, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 0, 1], 
     ...:        [1, 0, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [1, 0, 0, 0], 
     ...:        [0, 1, 0, 0], 
     ...:        [0, 1, 0, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 1, 0], 
     ...:        [0, 0, 0, 1], 
     ...:        [0, 0, 0, 1]], dtype=np.uint8)   

Похоже, where при транспонировании находит нужные индексы:

In [135]: np.where(arr.T)                                                    
Out[135]: 
(array([0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]),
 array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12]))
In [136]: np.where(arr.T)[1]                                                 
Out[136]: array([ 1,  4,  5,  6,  0,  7,  8,  2,  9, 10,  3, 11, 12])
0 голосов
/ 18 мая 2019

Вы можете сделать это, учитывая matrix в качестве ввода:

result = [i for i,x in enumerate(matrix.transpose().flatten()) if x == 1]
0 голосов
/ 18 мая 2019

Как сказано выше. Если вам нужно решение в форме векторов, тогда numpy - лучший выбор.

import numpy as np
arr = arr.transpose()
y = np.arange(arr.shape[0])
result =  list(map(lambda j: y[j==1], x))   
result = np.concatenate(result)

Хитрость заключается в том, чтобы использовать отдельный массив y для фильтрации индекса по условию.

0 голосов
/ 18 мая 2019

Вы должны попробовать с библиотекой NumPy в Python Очень эффективный и простой в использовании.

v = [[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]];
import numpy as np
flattenedArray = np.array(v).ravel()

print flattenedArray
for i in range(len(flattenedArray)):
if flattenedArray[i]>0:
       print i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...