根据numpy条件形成子阵列

时间:2017-01-17 15:49:00

标签: python arrays numpy

我有一组像

这样的值
import numpy as np 
dats = np.array([[r1,x1,y1],[r2,x2,y2],...,[rn,xn,yn]])

我需要找到具有元素的子阵列,使得坐标xi,yi位于围绕另一个点xp,yp的半径R的圆内。这是一个解决方案:

def dats_within_radius(R,xp,yp): 
    temp = np.array([])
    for loop in range(dats.shape[0]):
        r_loop = dats[loop][0]
        x_loop = dats[loop][1]
        y_loop = dats[loop][2]
        if (x_loop-x)**2+(y_loop-y)**2 <= R**2:
            temp = np.append(temp, [r_loop,x_loop,y_loop])
    temp = temp.reshape((int(temp.size/3),3))
    return temp

一定有更好的方法,对吗?任何人都可以给我一个推荐?

2 个答案:

答案 0 :(得分:3)

这是一个使用broadcasting -

的矢量化单线程
def dats_within_radius_vectorized(R,xp,yp): 
    return dats[((dats - [R,xp,yp])**2).sum(1) <= R**2]

为了表现,我建议使用np.einsum,就像这样 -

def dats_within_radius_vectorized2(dats, R,xp,yp): 
    subs = dats - [R,xp,yp]
    return dats[np.einsum('ij,ij->i',subs, subs) <= R**2]

运行时测试 -

In [82]: # Inputs
    ...: dats = np.random.randint(0,9,(10000,3))
    ...: R,xp,yp = 5,2,1
    ...: 

In [83]: %timeit dats_within_radius(dats,R,xp,yp) # Original soln
    ...: %timeit dats_within_radius_loop_compr(dats,R,xp,yp) # @BloodyD's soln
    ...: %timeit dats_within_radius_vectorized(dats,R,xp,yp)
    ...: %timeit dats_within_radius_vectorized2(dats,R,xp,yp)
    ...: 
10 loops, best of 3: 117 ms per loop
10 loops, best of 3: 38.8 ms per loop
1000 loops, best of 3: 517 µs per loop
1000 loops, best of 3: 410 µs per loop

答案 1 :(得分:2)

我会尝试像

这样的东西
public function __construct()
{
    $javaObject = new Java("i.guess.i.have.an.adress.here");

    $javaObject->setRBOAccount();
    $this->_objJava = $javaObject;
}

这里使用的事实是,在python中你可以1.直接迭代列表(或numpy数组)元素2.在python中你可以将迭代的值直接扩展到变量。最后List Comprehensions比循环

快得多