Читаемость немного интересна для наблюдателя, но два различных способа использования конструкции 1 in ... else 0
- это использование двойного for
l oop над элементами строк матрицы как
dummy = [[1 if x in [10, 15, 16, 17] else 0 for x in row] for row in arr]
Вывод это не np.array
(матрица), а скорее list
из list
с. Другой способ сделать это, который «скрывает» двойной for
l oop, состоит в использовании np.vectorize
в качестве
dummy_func = np.vectorize(lambda x: 1 if x in [10, 15, 16, 17] else 0)
dummy = dummy_func(arr)
или в качестве однострочного в качестве
dummy = np.vectorize(lambda x: 1 if x in [10, 15, 16, 17] else 0)(arr)
Из этих I вероятно go для векторизованного подхода сохранить тип данных как np.array
, поскольку это чаще всего более разумный выбор. И даже если бы я показывал это как одну строку, я все равно думал бы, что было бы лучше сначала определить функцию, а затем применить ее к двум различным строкам.
Следует отметить, что векторизация в основном это просто двойная for
l oop, поэтому выполнение выполняется довольно медленно по сравнению с другими numpy
функциями. Я не удивлюсь, если есть и другие способы, которые могут использовать встроенное параллельное вычислительное поведение numpy
, но тогда это снова компромисс между читаемостью (намерением) и скоростью.