我有一组像
这样的值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
一定有更好的方法,对吗?任何人都可以给我一个推荐?
答案 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比循环
快得多