Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2012 13:41:18

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

применить lambda

Можно упростить ниже указанный код, избавившись от цикла?

>>> x_new=[]
>>> x=array([1,2,3,4,5])
>>> for i in [1,2,3,4,5]:
... x_new=r_[ x_new, x[(x-i)<2] ]
...
>>> x_new
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
Мне, все таки, удалось избавиться от цикла.
>>> import numpy
>>> x=numpy.array([1.1,2.2,3.3,4.4,5.5])
>>> y=numpy.concatenate(map(lambda i: x[x-i>2], [0,1,2]))
>>> y
array([ 2.2, 3.3, 4.4, 5.5, 3.3, 4.4, 5.5, 4.4, 5.5])
Но, насколько эффективен такой код? Можно ли его усовершенствовать? Можно ли (ну и нужно ли) избавиться от генерации списка map()-ом?



Отредактировано (Март 18, 2012 10:58:16)

Офлайн

#2 Март 19, 2012 03:52:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

применить lambda

Хорошо бы увидеть условие задачи, а то ты решил двумя способами, но
вот это
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
и вот это
array()
как бы совершенно разные вещи, и абсолютно непонятно, что же на самом деле надо.
Кажется, что ты изобретаешь какой-то весьма странный велосипед



Офлайн

#3 Март 19, 2012 10:59:41

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

применить lambda

А что такое r_ у вас?

Офлайн

#4 Март 19, 2012 18:38:00

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

применить lambda

Piton23
А что такое r_ у вас?
используется для объединения строк



Офлайн

#5 Март 19, 2012 18:39:41

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

применить lambda

FishHook
Хорошо бы увидеть условие задачи, а то ты решил двумя способами, но
вот это
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
и вот это
array()
как бы совершенно разные вещи, и абсолютно непонятно, что же на самом деле надо.
Кажется, что ты изобретаешь какой-то весьма странный велосипед
из массива x для разных i отфильтровать такие элементы, для которых x-i<2 . Вот решение 2-мя способами. Второй способ считаю более эффективным. Можно ли сделать еще лучше?
>>> import numpy
>>> y=[]
>>> x=numpy.array([1.1,2.2,3.3])
>>> for i in [1,2,3]:
... y=numpy.r_[ y, x[(x-i)<2] ]
...
>>> z=numpy.concatenate(map(lambda i: x[(x-i)<2],[1,2,3]))
>>> y
array([ 1.1, 2.2, 1.1, 2.2, 3.3, 1.1, 2.2, 3.3])
>>> z
array([ 1.1, 2.2, 1.1, 2.2, 3.3, 1.1, 2.2, 3.3])
>>>
P.S.1 содержимое массивов не имеет значение. Нужно на примере конкретной задачи избавиться от оператора цикла, к-й сильно замедляет расчеты + желательно составить оператор из быстрых операторов numpy.
P.S.2 не нравится мне map, почему-то во втором спообе решения



Отредактировано (Март 19, 2012 18:41:40)

Офлайн

#6 Март 20, 2012 03:52:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

применить lambda

Так пойдёт?

x=[1.1,2.2,3.3,255,0.3,4,33]
i=[1,2,3]
result=[ item for item in x if filter(lambda i_n:item-i_n<2, i) ]
print result
>>> [1.1, 2.2, 3.3, 0.3, 4]



Отредактировано (Март 20, 2012 03:59:04)

Офлайн

#7 Март 20, 2012 11:46:32

nindza
От:
Зарегистрирован: 2011-11-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

применить lambda

FishHook
Так пойдёт?
пойдет :-) , работает быстро! Но, опять, результат, как я понимаю, сначала список, а затем numpy.array. Может можно получить сразу numpy.array?

$ cat test.py 
#!/usr/bin/python
import numpy, time

x=2.2*numpy.array([1.1,2.2,3.3,4.4,5.5])
N=50000
t1=time.clock()
y=[]
for i in numpy.linspace(0,1,N):
y=numpy.r_[ y, x[(x-i)<2] ]
t2=time.clock(); print t2-t1


t1=time.clock()
z=numpy.concatenate(map(lambda i: x[(x-i)<2],numpy.linspace(0,1,N)))
t2=time.clock(); print t2-t1


t1=time.clock()
i=numpy.linspace(0,1,N)
f=numpy.array([ item for item in x if filter(lambda i_n:item-i_n<2, i) ])
t2=time.clock(); print t2-t1

$ ./test.py
2.28
0.46
0.44
$ ./test.py
2.33
0.46
0.42
$ ./test.py
2.29
0.48
0.48
$ ./test.py
2.37
0.5
0.41
$ ./test.py
2.34
0.48
0.42



Офлайн

#8 Март 21, 2012 05:42:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

применить lambda

Нинзя, а нахрена тебе массив, чем список не устраивает?



Офлайн

#9 Март 21, 2012 18:23:55

dd67
От:
Зарегистрирован: 2011-12-22
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

применить lambda

FishHook
Нинзя, а нахрена тебе массив, чем список не устраивает?
так дан массив numpy и есть подозрение, что преобразование массива в список, а затем в обратно массив лишнее. + просто разбираюсь и думаю над эффективной работой с числовыми данными.


P.S. пароль от ниндзи потерял, сообщение как-то само прошло от нидзи (наверное какие-то старые куки).



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version