Использование np.where для поиска индекса элемента в двумерном массиве дает ValueError - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь использовать np.where, чтобы найти индекс элемента в массиве, в частности номер строки

У меня есть массив, скажем, размером 1000 x 6, с именем 'table'.Первый элемент в каждой строке представляет собой массив строк 2 x 2, а остальные - 0.Например.пример элементов 5x6 в таблице:

    [['s',' ']   0 0 0 0 0
     [' ',' ']]
    [[' ',' ']   0 0 0 0 0
     [' ','a']]
    [[' ',' ']   0 0 0 0 0
     [' ',' ']]         
    [['p',' ']   0 0 0 0 0
     [' ',' ']]
    [[' ',' ']   0 0 0 0 0
     ['b',' ']]  

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

Например.скажем, у меня есть

    grid = [['s',' ']   
            [' ',' ']]

Я хотел бы, чтобы мой код возвращал [0] [0]

Я пробовал это:

    i,j = np.where(table == grid)

, а также

    i,j = np.where(np.all(table == grid))

и я получаю следующую ошибку:

    ValueError: not enough values to unpack (expected 2, got 1)

Использование одного значения, например.

    index = np.where(table == grid) 

, не приводит к ошибке, но печать (индекс) будетвыведите пустой массив:

    (array([], dtype=int64),)

Из похожих вопросов о переполнении стека я не могу понять, как эта ошибка относится к моей, и я смотрю на нее целую вечность

Любая помощь будет высоко ценится

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Настройка:

b = np.array([['s','t'],['q','r']])
c = np.array([['s',' '],[' ',' ']])
a = np.array([[c,0,0,0,0,0],
              [c,0,0,0,0,0],
              [c,0,0,0,0,0],
              [c,0,0,0,0,0],
              [b,0,0,0,0,0],
              [c,0,0,0,0,0],
              [c,0,0,0,0,0],
              [c,0,0,0,0,0],
              [c,0,0,0,0,0]])

Предполагается, что вас интересует только колонка ноль;написать функцию, которая будет проверять каждый элемент в массиве one-d.И примените его к нулевому столбцу

def f(args):
    return [np.all(thing==b) for thing in args]

>>> np.apply_along_axis(f,0,a[:,0])
array([False, False, False, False,  True, False, False, False, False])
>>> 

Используйте np.where на результат

>>> np.where(np.apply_along_axis(f,0,a[:,0]))
(array([4], dtype=int64),)

Или следуйте примечанию в numpy.where документах:

>>> np.asarray(np.apply_along_axis(f,0,a[:,0])).nonzero()
(array([4], dtype=int64),)

Как указывает @hpaulj, np.apply_along_axis не обязательно.так что

>>> [np.all(thing == b) for thing in a[:,0]]
[False, False, False, False, True, False, False, False, False]

>>> np.asarray([np.all(thing == b) for thing in a[:,0]]).nonzero()
(array([4], dtype=int64),)

И без итерации Python:

>>> (np.stack(a[:,0])==b).all(axis=(1,2))
array([False, False, False, False,  True, False, False, False, False])

>>> (np.stack(a[:,0])==b).all(axis=(1,2)).nonzero()
(array([4], dtype=int64),)
1 голос
/ 25 марта 2019

Вот решение с использованием векторизации

a = np.array( [np.array([['s',' '],[' ',' ']])  , 0, 0, 0, 0, 0 ])
grid = np.array([['s',' '],[' ',' ']]) 

vfunc = np.vectorize(lambda x: np.all(grid == x))
np.argwhere(vfunc(a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...