Настройка показателей, основанных на индексе в строке - PullRequest
2 голосов
/ 04 июня 2019

Я ищу эффективный способ установки индикаторов от нуля до известного числа (которое отличается для каждой строки).

, например

 a =
 array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
        [1, 0, 0, 0, 0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 0, 0, 0],
        [1, 1, 0, 0, 0, 0, 0, 0, 0],
        [1, 1, 1, 1, 1, 1, 1, 1, 0]])

и я знаю вектор с индексом, когда а становится от 1 до нуля.

b = [3, 1, 6, 2, 8]

Вместо того, чтобы заполнять все строки цикла for, я хочу знать, есть ли быстрый способ установить эти индикаторы.

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Самый простой способ, который я могу придумать:

result=[]
for row in array:
    result.append(row.tolist().index(0))

print(result)

[3, 1, 6, 2, 8]

Причина, по которой это работает, состоит в том, что список имеет метод с именем index, который сообщает о первом появлении определенного элемента в списке.Поэтому я перебираю этот 2-мерный массив, преобразуя каждый из них в список и используя индекс 0 для каждого.

Вы можете сохранить эти значения в другом списке и добавить к нему для каждой строки, и все.

1 голос
/ 04 июня 2019

Используйте outer-comparison в массиве ранжирования против b -

In [16]: ncols = 9

In [17]: b
Out[17]: [3, 1, 6, 2, 8]

In [19]: np.greater.outer(b,np.arange(ncols)).view('i1')
Out[19]: 
array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 0, 0, 0],
       [1, 1, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 0]], dtype=int8)

Другие аналогичные способы выразить то же самое -

(np.asarray(b)[:,None] > np.arange(ncols)).view('i1')
(np.asarray(b)[:,None] > np.arange(ncols)).astype(int)

С b, являющийся массивом, еще больше упрощается, поскольку мы можем пропустить преобразование массива с помощью np.asarray(b).

0 голосов
/ 04 июня 2019

Вы можете использовать трансляцию для внешнего сравнения:

b = np.asarray([3, 1, 6, 2, 8])

a = (np.arange(b.max() + 1) < b[:, None]).astype(int)
# array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
#        [1, 0, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 1, 1, 1, 1, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 1, 1, 1, 1, 1, 1, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...