как получить первое вхождение элемента из каждой строки в двумерном массиве numpy?

1

У меня есть массив 2d numpy. Я ищу индексы первого появления определенного элемента в каждой строке. Результатом будет массив (nx 2), где n - количество строк, и каждая запись содержит координаты x и y первого события этого конкретного элемента.

Большое спасибо.

Теги:
numpy

3 ответа

1
Лучший ответ

Я не совсем понимаю, что вы подразумеваете под координатой "s и y", поэтому я предполагаю, что вы имеете в виду позицию строки и столбца.

import numpy as np
np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array)])

Обратите внимание, что это приведет к повышению ValueError если your_element не содержался в некоторой строке.

Следующая версия даст вам вывод, который может содержать меньше строк, чем вход, но не будет вызывать ValueError для случая, когда your_element отсутствовал в строке.

np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array) if your_element in row])
  • 0
    да, вы правильно поняли ... я хотел написать координаты x и y ... Ну, может ли быть какое-либо решение, которое содержит только строки с индексами первого элемента, где элемент выходит без -1? Или мы можем сделать любую постобработку, чтобы избежать этого? Спасибо
  • 0
    Какое поведение вы хотите, чтобы у вас был код для случая, когда your_element не содержался в строке? Вы могли бы: а) сначала удалить эти строки из входных данных; б) заполнить y-позицию вывода значением заполнителя; в) вызвать исключение
Показать ещё 4 комментария
1
>>> # generate some fake data:
>>> A = NP.random.randint(5, 10, 100).reshape(10, 10)
>>> A
  array([[5, 7, 8, 8, 5, 6, 6, 9, 6, 9],
        [9, 8, 8, 9, 5, 6, 6, 9, 8, 9],
        [8, 5, 6, 7, 8, 9, 5, 8, 6, 7],
        [5, 8, 8, 6, 9, 6, 8, 5, 8, 9],
        [6, 9, 8, 8, 5, 7, 6, 5, 7, 6],
        [7, 8, 6, 7, 6, 6, 7, 8, 6, 8],
        [8, 6, 8, 9, 8, 8, 9, 6, 8, 7],
        [8, 7, 8, 5, 9, 5, 7, 8, 6, 9],
        [9, 6, 5, 9, 9, 8, 8, 9, 8, 8],
        [6, 8, 5, 8, 6, 5, 8, 6, 8, 5]])

>>> # sort this 2D array along one axis (i chose row-wise)
>>> A = NP.sort(A, axis=1)
>>> A
  array([[5, 5, 6, 6, 6, 7, 8, 8, 9, 9],
         [5, 6, 6, 8, 8, 8, 9, 9, 9, 9],
         [5, 5, 6, 6, 7, 7, 8, 8, 8, 9],
         [5, 5, 6, 6, 8, 8, 8, 8, 9, 9],
         [5, 5, 6, 6, 6, 7, 7, 8, 8, 9],
         [6, 6, 6, 6, 7, 7, 7, 8, 8, 8],
         [6, 6, 7, 8, 8, 8, 8, 8, 9, 9],
         [5, 5, 6, 7, 7, 8, 8, 8, 9, 9],
         [5, 6, 8, 8, 8, 8, 9, 9, 9, 9],
         [5, 5, 5, 6, 6, 6, 8, 8, 8, 8]])

>>> # now diff the sorted array along the same axis
>>> A1 = NP.diff(A ,axis=1)

>>> # A1 contains non-zero values for "first occurrences" and
>>> # zero values for repeat values
>>> A1
  array([[0, 1, 0, 0, 1, 1, 0, 1, 0],
         [1, 0, 2, 0, 0, 1, 0, 0, 0],
         [0, 1, 0, 1, 0, 1, 0, 0, 1],
         [0, 1, 0, 2, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 1, 0, 1, 0, 1],
         [0, 0, 0, 1, 0, 0, 1, 0, 0],
         [0, 1, 1, 0, 0, 0, 0, 1, 0],
         [0, 1, 1, 0, 1, 0, 0, 1, 0],
         [1, 2, 0, 0, 0, 1, 0, 0, 0],
         [0, 0, 1, 0, 0, 2, 0, 0, 0]])

вы можете переформулировать результат A1, если необходимо, например, как булевой массив, имеющий ту же форму, что и A1, в которой каждая ячейка является либо T/F, в зависимости от того, представляет ли значение в исходной матрице первое вхождение этого значения:

>>> ndx = A1==0
>>> ndx
  array([[ True, False,  True,  True, False, False,  True, False,  True],
         [False,  True, False,  True,  True, False,  True,  True,  True],
         [ True, False,  True, False,  True, False,  True,  True, False],
         [ True, False,  True, False,  True,  True,  True, False,  True],
         [ True, False,  True,  True, False,  True, False,  True, False],
         [ True,  True,  True, False,  True,  True, False,  True,  True],
         [ True, False, False,  True,  True,  True,  True, False,  True],
         [ True, False, False,  True, False,  True,  True, False,  True],
         [False, False,  True,  True,  True, False,  True,  True,  True],
         [ True,  True, False,  True,  True, False,  True,  True,  True]], dtype=bool)
1

Если я правильно понял вопрос, вам нужно что-то вроде этого:

import numpy as N
#
nrows=5
ncols=10 
#
a=N.random.random((nrows,ncols))
b=-99*N.ones((nrows,2))
#
for j in range(nrows):
    for i in range(ncols):
        if(a[j,i]<0.5):
            b[j,0]=i
            b[j,1]=j
            continue

Ещё вопросы

Сообщество Overcoder
Наверх
Меню