Найти - Пользователи
Полная версия: применить lambda
Начало » Python для новичков » применить lambda
1
dd67
Можно упростить ниже указанный код, избавившись от цикла?
>>> 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()-ом?
FishHook
Хорошо бы увидеть условие задачи, а то ты решил двумя способами, но
вот это
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
и вот это
array()
как бы совершенно разные вещи, и абсолютно непонятно, что же на самом деле надо.
Кажется, что ты изобретаешь какой-то весьма странный велосипед
Piton23
А что такое r_ у вас?
dd67
Piton23
А что такое r_ у вас?
используется для объединения строк
dd67
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, почему-то во втором спообе решения
FishHook
Так пойдёт?

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]
nindza
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
FishHook
Нинзя, а нахрена тебе массив, чем список не устраивает?
dd67
FishHook
Нинзя, а нахрена тебе массив, чем список не устраивает?
так дан массив numpy и есть подозрение, что преобразование массива в список, а затем в обратно массив лишнее. + просто разбираюсь и думаю над эффективной работой с числовыми данными.


P.S. пароль от ниндзи потерял, сообщение как-то само прошло от нидзи (наверное какие-то старые куки).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB