LINUX.ORG.RU

python заменить цикл


0

1

Есть массив x_old, и нужно заменить значения этого массива на значения массива x_new. Но, из x_new можно для замены брать только те значения, которые удовлетворяют определенному условию. x_old и x_new хранят координаты точек на плоскости. Условие следующее: из x_new нужно брать только те точки, которые лежат вне эллипса с параметрами xc,yc - центр, а,b - полуоси.

Задачу решает код с циклом: Код:

#!/usr/bin/python
from numpy import *
m=3
xc=0.
yc=0.
a=2.
b=1.
eps=0.1
x_old=ones((m,2),dtype='d')
x_new=ndarray((m,2),dtype='d')
x_new[0][0]=2.;x_new[0][1]=0.
x_new[1][0]=3.;x_new[0][1]=1.
x_new[2][0]=1.;x_new[0][1]=0.
for i in range(m):
    if (x_new[i][0]-xc)**2/a/a+(x_new[i][1]-yc)**2/b/b>(1.+eps):
        x_old[i]=x_new[i]
print "x_new=",x_new
print "x_old=",x_old
от цикла хотелось бы избавиться (устраняю медленные участки). Можно ли решить задачу без цикла средствами numpy?

А, в лоб, заменить range на enumerate или xrange не помогает?

Norgat ★★★★★ ()

Хочешь ускорить - перепиши на C :)

ttnl ★★★★★ ()

Попробуй, заменить цикл

msk = (x_new[:,0]-xc)**2/a/a+(x_new[:,1]-yc)**2/b/b > (1.+eps)
x_old[msk] = x_new[msk]

Если не подойдет читай документацию по numpy

ogronom ()
Ответ на: комментарий от ogronom

msk = (x_new[:,0]-xc)**2/a/a+(x_new[:,1]-yc)**2/b/b > (1.+eps)

Спасибо! то что нужно! и просто!

Опять вопрос, близкий к посту. Как выполнить логическую операцию and со всеми элементами массива?

inx=[i0 i1 i2 ... in-1]
искомая_операция==i0 and i1 and ... in-2 and in-1
math-beginer ()
Ответ на: комментарий от math-beginer

> lambda лучше не применять для больших массивов

это что значит ?! может они имели в виду чонть типа

asd = lambda *x: ...

а потом

qwe = range(1000) asd(*qwe)

???

приведенный мной пример - это лямбда принимающая ровно два аргумента. по массиву же пробегается редуце.

mmarkk ()
Ответ на: комментарий от mmarkk

> reduce(lambda x,y: x and y, array_of_values)

reduce не намного быстрее цикла.

tailgunner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.