Python: параметры функции в виде кортежа с одним выходом - PullRequest
0 голосов
/ 03 июля 2018

У меня есть функция в Python, которая вычисляет энтропию ряда параметров, которые я называю ps следующим образом

def H(*ps): 
    sum = 0.0
    for pi in ps:
        sum = sum - pi*np.log2(pi)
    return sum

Я хочу иметь возможность передавать несколько параметров в виде списка или кортежа, т. Е. H([x]), но это не дает правильного результата, скорее он вычисляет значение H(xi) и возвращает кортеж с каждым результатом. Я могу суммировать каждый элемент кортежа, чтобы получить правильный результат из-за характера функции, но я бы предпочел, чтобы функция выдавала желаемый результат для удобства. Если я введу H(x1, x2, ...), функция выдаст правильный вывод.

Если у кого-нибудь есть предложения, пожалуйста, дайте мне знать.

Заранее спасибо.

EDIT:

Пример ввода и вывода:

x = [0.1, 0.2]
print H(0.1, 0.2), H(x)

0.796578428466 [ 0.33219281  0.46438562]

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы можете передать аргумент как list или tuple. Вы можете избежать использования трюка распаковки здесь.

def H(ps): #updated, not asterisk 
    my_sum = 0.0
    for pi in ps:
        my_sum = my_sum - pi*np.log2(pi)
    return my_sum
x = [0.1, 0.2]
print (H([0.1, 0.2])) #argument as list
print(H(x)) #argument as list
0 голосов
/ 03 июля 2018

Не распаковывать через оператор * в определении вашей функции. Вы уже просматриваете свой список в цикле for. В качестве аргумента функции естественно использовать итерацию.

def H(ps): 
    x = 0.0
    for pi in ps:
        x = x - pi*np.log2(pi)
    return x

res = H([0.1, 0.2])

print(res)
0.796578428466

Кроме того, не следите за встроенным sum, это плохая практика.

...