Эффективная оценка функции в каждой ячейке массива NumPy

Учитывая массив NumPy A , что является самым быстрым /наиболее эффективный способ применить функцию же , f , к каждой ячейке?

  1. Предположим, что мы назначим A (i, j) f (A (i, j)) .

  2. Функция f не имеет двоичного вывода, поэтому операции с маской (ing) не помогут.

Является ли "очевидная" итерация двойного цикла (через каждую ячейку) оптимальным решением?

113 голосов | спросил Peter 9 +04002011-10-09T08:21:10+04:00312011bEurope/MoscowSun, 09 Oct 2011 08:21:10 +0400 2011, 08:21:10

3 ответа


0

Вы можете просто векторизовать функцию и затем применить ее непосредственно к Numpy массив каждый раз, когда вам это нужно:

import numpy as np

def f(x):
    return x * x + 3 * x - 2 if x > 0 else x * 5 + 8

f = np.vectorize(f)  # or use a different name if you want to keep the original f

result_array = f(A)  # if A is your Numpy array

Вероятно, лучше указывать явный тип вывода непосредственно при векторизации:

f = np.vectorize(f, otypes=[np.float])
ответил blubberdiblub 9 +04002011-10-09T09:06:11+04:00312011bEurope/MoscowSun, 09 Oct 2011 09:06:11 +0400 2011, 09:06:11
0

Аналогичный вопрос: Сопоставление массива NumPy на месте . Если вы можете найти ufunc для своего f ( ), тогда вам следует использовать параметр out.

ответил cyborg 10 +04002011-10-10T04:02:52+04:00312011bEurope/MoscowMon, 10 Oct 2011 04:02:52 +0400 2011, 04:02:52
0

Если вы работаете с числами и f(A(i,j)) = f(A(j,i)), вы можете использовать scipy.spatial.distance.cdist определяя f как расстояние между A(i) и A(j).

ответил Raphaël Fettaya 10 Maypm16 2016, 14:59:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132