Форум сайта python.su
1
Можно упростить ниже указанный код, избавившись от цикла?
>>> 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])
Отредактировано (Март 18, 2012 10:58:16)
Офлайн
568
Хорошо бы увидеть условие задачи, а то ты решил двумя способами, но
вот это
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
и вот это
array()
как бы совершенно разные вещи, и абсолютно непонятно, что же на самом деле надо.
Кажется, что ты изобретаешь какой-то весьма странный велосипед
Офлайн
5
А что такое r_ у вас?
Офлайн
1
Piton23используется для объединения строк
А что такое r_ у вас?
Офлайн
1
FishHookиз массива x для разных i отфильтровать такие элементы, для которых x-i<2 . Вот решение 2-мя способами. Второй способ считаю более эффективным. Можно ли сделать еще лучше?
Хорошо бы увидеть условие задачи, а то ты решил двумя способами, но
вот это
array([ 1., 2., 1., 2., 3., 1., 2., 3., 4., 1., 2., 3., 4.,
5., 1., 2., 3., 4., 5.])
и вот это
array()
как бы совершенно разные вещи, и абсолютно непонятно, что же на самом деле надо.
Кажется, что ты изобретаешь какой-то весьма странный велосипед
>>> 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])
>>>
Отредактировано (Март 19, 2012 18:41:40)
Офлайн
568
Так пойдёт?
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)
Офлайн
0
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
Офлайн
568
Нинзя, а нахрена тебе массив, чем список не устраивает?
Офлайн
1
FishHookтак дан массив numpy и есть подозрение, что преобразование массива в список, а затем в обратно массив лишнее. + просто разбираюсь и думаю над эффективной работой с числовыми данными.
Нинзя, а нахрена тебе массив, чем список не устраивает?
Офлайн