Как передать параметр, используя numpy .vectorize - PullRequest
0 голосов
/ 04 августа 2020

Я пытался использовать numpy с объектами и запускать функции. Я пытался использовать функцию numpy.vectorize, и она отлично работает, но я не знаю, как передавать параметры, например, через код

import numpy as np
class ex:
   def __init__(self, a, b):
       self.a = a
       self.b = b

   def exfunc(self, c):
       print(c)

str = "hi"
lis =np.array([ex() for x in range(10)])    
exvec = np.vectorize(ex.exfunc, otypes=[object])

теперь я не знаю, как это будет сделано, но я хотел бы иметь возможность передать такую ​​детскую коляску exvec(lis,str), но это не работает, поэтому я хотел бы знать, как я могу сделать что-то подобное к тому, что я только что показал Заранее спасибо

1 Ответ

0 голосов
/ 04 августа 2020

Чтобы указать параметры, которые будут передаваться «извне» (исключенные из заполнения из исходного массива), передайте параметр excluded в np.vectorize со списком строк - именами параметров векторизованной функции.

Пример:

  1. Исходный массив:

     a = np.array(['abc', 'def', 'ghi', 'jko'])
    
  2. Функция для векторизации:

     def myConcat(t1, t2):
         return t1 + '_' + t2
    

    Вы хотите, чтобы t2 передавался «извне» (и t1 заполнялся из базового массива).

  3. Создать векторизованную функцию:

     myConc = np.vectorize(myConcat, excluded=['t2'])
    
  4. Вызов этой функции:

     myConc(a, 'xx')
    

Результат:

array(['abc_xx', 'def_xx', 'ghi_xx', 'jko_xx'], dtype='<U6')

И примечание о вашем коде: результат пустой, поскольку ваша функция ( exfun c) только печатает свой аргумент, но ничего не возвращает.

И модифицированный пример на основе вашего класса:

class ex:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def exfunc(self, c):
        print(c)
        return self.a + '_' + c + '_' + self.b

# Array of "ex" objects
lis = np.array([ex('a' + str(x), 'b' + str(x)) for x in range(10)])
# Create vectorized version of "exfunc"
exvec = np.vectorize(ex.exfunc, otypes=[object], excluded=['c'])
# Run this function
exvec(lis, np.array(['h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8', 'h9']))

Обратите внимание, что теперь exfun c что-то возвращает.

Результат:

h0
h1
h2
h3
h4
h5
h6
h7
h8
h9

array(['a0_h0_b0', 'a1_h1_b1', 'a2_h2_b2', 'a3_h3_b3', 'a4_h4_b4',
       'a5_h5_b5', 'a6_h6_b6', 'a7_h7_b7', 'a8_h8_b8', 'a9_h9_b9'],
      dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...