Запустите соответствующую функцию для каждого элемента numpy в столбце - PullRequest
0 голосов
/ 23 апреля 2020

Есть ли способ ускорить вызов различных функций через определенные элементы массива? Здесь мы хотели бы вызвать функцию для каждого элемента во 2-м столбце на основе номера функции в 3-м столбце.

import numpy
a = numpy.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])

a
[[12  0  0  0  0]
 [ 0  1  4  1  0]
 [ 2  8  2  0  0]
 [ 6  3  5  1  0]]

Для l oop, который используется в настоящее время, становится чрезвычайно медленным, когда количество строк увеличивается , С миллионами рядов это увеличивается до дюжины минут.

for y in range(1, a.shape[0]+1):
    exec('func{}()'.format(a[y, 2]))

def func4():
    a[y, 1 ] = a[y, 1] + 2

 def func2():
    a[1, 1 ] = a[1, 1] + 1

def func5():
   return

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Почему бы просто не иметь одну функцию с несколькими ветвями? Это позволит избежать форматирования строки, и вы можете вызывать другие функции, если не хотите помещать все логи c в одну функцию. Вы пробовали это и нашли, если проверки слишком медленные?

Этот код показывает, как вы могли бы разбить его, имея основную функцию, которая принимает два аргумента и либо запускает соответствующий код, либо вызывает подфункцию.

import numpy as np

a = np.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])


def main_func(c2_val, c3_val):
    if c3_val == 0:
        print("called with col3 value of 0")
        # code for func you would call i.e.
        a[c3_val, 1] = a[c3_val, 1] + 2
    elif c3_val == 4:  # on if for each possible outcome
        # or have it call another function
        func4()
    # etc


def func4():
    print("called with col3 value of 4")


for row in a:
    print(row)
    main_func(row[1], row[2])

Примечание. Если вы Вы действительно беспокоитесь о времени выполнения, и некоторые значения, скорее всего, не забудьте поставить их выше, так что нужно меньше проверок.

0 голосов
/ 23 апреля 2020

Вы можете попробовать:

my_func=eval('['+",".join(["func{}".format(x) for x in range(1,5+1)])+']')
or
my_func=[func0,func1,func2,func3,func4,func5]

for y in range(1, a.shape[0]+1):
        my_func[a[y, 2]]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...