Векторизация сложной функции - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь ускорить некоторые из моих циклов for, используя векторизацию. К сожалению, функции внутри циклов более сложны, чем простые арифметические операции. Я хочу взять каждый элемент массива, манипулировать им, используя функцию с несколькими входами, а затем поместить его в правильное место в словаре. Для этого у меня есть функция под названием increment_element:

def increase_element(number, word, factor=0.05):
    print(2.*factor)
    return {'factor': 2.*factor, 'number': number, 'word': word}

То, что я пытаюсь достичь, это перейти от массива:

array([0., 0.1, 0.2])

к массиву:

array([
       {factor: 0., number: 5, word: 'hi'},
       {factor: 0.2, number: 5, word: 'hi'},
       {factor: 0.4, number: 5, word: 'hi'}
      ])

эффективным способом (т. Е. Без использования цикла for), поскольку в действительности функция increment_element выполняется долго.

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

import numpy as np

muls = np.linspace(0, 1, 11)

def increase_element(number, word, factor=0.05):
    print(2.*factor)
    return {'factor': 2.*factor, 'number': number, 'word': word}

def single_increase_element(inputs):
    return increase_element(inputs[0], inputs[1], factor=inputs[2])

single_array = np.array(list(map(lambda x: (5, 'hi', x), muls)))

np.array(list(map(single_increase_element, single_array)))

Однако я получаю приведенную ниже ошибку при попытке вывести 2. * factor

TypeError: canне умножайте последовательность на не-int типа 'float'

Любой совет будет принят с благодарностью!

1 Ответ

0 голосов
/ 25 октября 2019

фактор в вашей печати имеет тип <class 'numpy.str_'>. ошибка в том, что вы вводите несколько строк с 2.0.

Что касается кода, я предлагаю вам объяснить, чего вы пытаетесь достичь, потому что его очень сложно понять.

Редактировать:ниже это ваш код исправлен. Основной причиной было отсутствие dtype = np.object, а числа обрабатывались как строки.

import numpy as np

muls = np.linspace(0, 1, 11)

def increase_element(number, word, factor=0.05):
    print(2.*factor)
    return {'factor': 2.*factor, 'number': number, 'word': word}

def single_increase_element(inputs):
    return increase_element(*inputs)  # fixed
    # return increase_element(inputs[0], inputs[1], factor=inputs[2]) # original

# single_array = np.array(list(map(lambda x: (5, 'hi', x), muls)))  # original
single_array = np.array(list(map(lambda x: (5, 'hi', x), muls)), dtype=np.object) # fixed

np.array(list(map(single_increase_element, single_array)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...