поиск элемента массива numpy, удовлетворяющего условию

можно использовать numpy ' s extract функция для соответствия элементу в массиве. Следующий код соответствует элементу 'a.' точно в массиве. Предположим, я хочу ... чтобы соответствовать всем элементам, содержащим '.', как бы я это сделал? Обратите внимание, что в этом случае было бы два матча. Я также хотел бы получить номер строки и столбца совпадений. Метод не должен использовать extract; подойдет любой метод. Спасибо.

In [110]: x = np.array([['a.','cd'],['ef','g.']])

In [111]: 'a.' == x
Out[111]: 
array([[ True, False],
       [False, False]], dtype=bool)

In [112]: np.extract('a.' == x, x)
Out[112]: 
array(['a.'], 
      dtype='|S2')

2 ответов


можно использовать строковые операции:

>>> import numpy as np
>>> x = np.array([['a.','cd'],['ef','g.']])
>>> x[np.char.find(x, '.') > -1]
array(['a.', 'g.'], 
      dtype='|S2')

EDIT: согласно запросу в комментариях... Если вы хотите узнать индексы, где целевое условие истинно, используйте и NumPy.где:

>>> np.where(np.char.find(x, '.') > -1)
(array([0, 1]), array([0, 1]))

или

>>> zip(*np.where(np.char.find(x, '.') > -1))
[(0, 0), (1, 1)]

Как насчет этого?

>>> import numpy as np
>>> x = np.array([['a.','cd'],['ef','g.']])
>>> selector = np.array(['.' in s for s in x.flat]).reshape(x.shape)
>>> x[selector]
array(['a.', 'g.'], 
      dtype='|S2')