Почему NumPy, где операция быстрее, чем применить функцию? - PullRequest
4 голосов
/ 13 мая 2019

При создании нового столбца в кадре данных pandas на основе некоторого условия метод numpy's превосходит метод apply с точки зрения времени выполнения, почему это так?

Например:

df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)

df["log2FC"] = np.where(df["C1Mean"]==0,
                        np.log2(df["C2Mean"]), 
                        np.log2(df["C2Mean"]/df["C1Mean"]))

1 Ответ

4 голосов
/ 13 мая 2019

Этот вызов apply является постраничной итерацией:

df["log2FC"] = df.apply(lambda x: np.log2(x["C2Mean"]/x["C1Mean"]) if x["C1Mean"]> 0 else np.log2(x["C2Mean"]), axis=1)

apply - это просто синтаксический сахар для цикла, вы передали axis=1, так что это построчно.

Ваш второй фрагмент

df["log2FC"] = np.where(df["C1Mean"]==0,
                        np.log2(df["C2Mean"]), 
                        np.log2(df["C2Mean"]/df["C1Mean"]))

действует на все столбцы, поэтому он векторизован.

Другое дело, что pandas выполняет больше проверок, выравнивания индекса и т. Д., Чем numpy.

Ваши вызовы np.log2 не имеют смысла в этом контексте, так как вы передаете скалярные значения:

 np.log2(x["C2Mean"]/x["C1Mean"])

с точки зрения производительности это будет то же самое, что и вызов math.log2

Объяснение того, почему NumPy значительно быстрее или что такое векторизация, выходит за рамки этого вопроса. Вы можете видеть это: Что такое векторизация? .

Здесь важно то, что numpy может и будет использовать внешние библиотеки, написанные на C или Fortran, которые по своей природе быстрее, чем python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...