Форум сайта python.su
0
Изучаю numpy
.
Решил написать программу распределения некоторого числа по элементам массива, состоящего из чисел, пропорционально его числовым значениям.
Задача 1
у нас есть одномерный массив состоящий из 5-ти элементов 20, 25, 30, 22, 33
и есть число 70, которое мы должны распределить
для решения данной задачи хорошо подходит numpy
и я написал следующий скрипт:
import numpy as np vG = 70. mL = np.array([20, 25, 30, 22, 33 ], np.float) print (mL) vA = np.sum(mL) print (vA) mP = vG * mL / vA print (mP) print (np.sum(mP))
Отредактировано jagg (Май 29, 2014 15:34:33)
Офлайн
0
смотрел в сторону numpy.linalg
но из распределений там только линейные или нормальные (по гауссиане)
Офлайн
253
jaggЕсть один мощный метод:
решение должно универсальным, то есть не быть независимым от количества групп
for i,j in zip(M,N): ....
Офлайн
857
>>> def f(arr, n): ... k = n / sum(arr) ... return tuple(k * i for i in arr) ... >>> mlst = ((20, 25, 30, 22, 33), (40, 10, 35), (10, 30, 20, 15)) >>> nlst = (70, 50, 60) >>> >>> tuple(map(f, mlst, nlst)) ((10.769230769230768, 13.461538461538462, 16.153846153846153, 11.846153846153845, 17.76923076923077), (23.529411764705884, 5.882352941176471, 20.58823529411765), (8.0, 24.0, 16.0, 12.0)) >>>
Офлайн
0
doza_and

>>> mB = np.array ([70., 50., 60.]) >>> mL = np.array ([ [20., 25., 30., 22., 33.], [40., 10., 35.], [10., 30., 20., 15.] ]) >>> def f_sum (n, m): ... import numpy as np ... return np.array (tuple (i * (j / np.sum(j)) for i, j in zip(n, m))) ... >>> x = f_sum (mB, mL) >>> print (x) [ array([ 10.76923077, 13.46153846, 16.15384615, 11.84615385, 17.76923077]) array([ 23.52941176, 5.88235294, 20.58823529]) array([ 8., 24., 16., 12.])]
i * (j / np.sum(j)) for i, j in zip(n, m)
Отредактировано jagg (Май 30, 2014 08:39:48)
Офлайн
0
py.user.next
- результат не тот>>> def f(arr, n): ... k = n / sum(arr) ... return tuple(k * i for i in arr) ... >>> mlst = ((20, 25, 30, 22, 33), (40, 10, 35), (10, 30, 20, 15)) >>> nlst = (70, 50, 60) >>> >>> tuple(map(f, mlst, nlst)) ((0, 0, 0, 0, 0), (0, 0, 0), (0, 0, 0, 0))
>>> import numpy as np >>> >>> narray = np.array ([70., 50., 60.]) >>> marray = np.array ([ [20., 25., 30., 22., 33.], [40., 10., 35.], [10., 30., 20., 15.] ]) >>> >>> def f(arr, n): ... return (n * (arr / np.sum(arr))) ... >>> map(f, marray, narray) [array([ 10.76923077, 13.46153846, 16.15384615, 11.84615385, 17.76923077]), array([ 23.52941176, 5.88235294, 20.58823529]), array([ 8., 24., 16., 12.])]
Отредактировано jagg (Май 30, 2014 08:59:33)
Офлайн
857
jagg
но у меня не пошло
>>> def f(arr, n): ... k = float(n) / sum(arr) ... return tuple(k * i for i in arr) ... >>> mlst = ((20, 25, 30, 22, 33), (40, 10, 35), (10, 30, 20, 15)) >>> nlst = (70, 50, 60) >>> >>> map(f, mlst, nlst) [(10.769230769230768, 13.461538461538462, 16.153846153846153, 11.846153846153845, 17.76923076923077), (23.529411764705884, 5.882352941176471, 20.58823529411765), (8.0, 24.0, 16.0, 12.0)] >>>
Отредактировано py.user.next (Май 30, 2014 09:14:43)
Офлайн
0
py.user.nextзаработало! спасибо.
map(f, mlst, nlst)
Офлайн
0
краткое резюме:
погонял оба варианта
НАИБОЛЕЕ быстрым является вариант, с использованием map(f, m, n),
что ожидаемо
.
еще раз всем спасибо.
Офлайн
0
конечное решение, с проверкой деления на 0
lambda asource, atarget: map (lambda n, arr: n * (arr / np.sum(arr)) if np.sum(arr)<>0 else (arr) * 0, asource, atarget)
Офлайн