Вы можете использовать np.core.defchararray.isdigit()
, чтобы найти индексы цифр, а затем использовать логический операнд, чтобы получить индексы элементов с наноразрядными числами. После этого вы можете просто использовать np.where()
, чтобы получить соответствующие индексы:
In [20]: arr = np.array(['10', '20', 'a', '4', '%'])
In [24]: np.where(~np.core.defchararray.isdigit(arr))
Out[24]: (array([2, 4]),)
Если вы хотите проверить несколько типов, таких как float, вы можете использовать пользовательскую функцию, а затем с помощью np.vectorize
применить функцию к вашему массиву. Для дат это немного сложно, но если вам нужен общий способ для этого, вы можете использовать dateutils.parser()
.
Вы можете использовать функцию, подобную следующей:
# from dateutils import parser
In [33]: def check_type(item):
...: try:
...: float(item)
...: except:
...: try:
...: parser.parse(item)
...: except:
...: return True
...: else:
...: return False
...: else:
...: return False
Тогда:
vector_func = np.vectorize(check_type)
np.where(vector_func(arr))
Демо-версия:
In [45]: arr = np.array(['10.34', '-20', 'a', '4', '%', '2018-5-01'])
In [46]: vector_func = np.vectorize(check_type)
...: np.where(vector_func(arr))
...:
Out[46]: (array([2, 4]),)