我有两个数组说:
A = np.array([[ 1. , 1. , 0.5 ],
[ 2. , 2. , 0.7 ],
[ 3. , 4. , 1.2 ],
[ 4. , 3. , 2.33],
[ 1. , 2. , 0.5 ],
[ 6. , 5. , 0.3 ],
[ 4. , 5. , 1.2 ],
[ 5. , 5. , 1.5 ]])
B = np.array([2,1])
我想找到 A
的所有值,这些值不在 B
的 2 半径范围内。
我的答案应该是:
C = [[3,4,1.2],[4,3,2.33],[6,5,0.3],[4,5,1.2],[5,5,1.5]]
有没有 pythonic 的方法来做到这一点?
我试过的是:
radius = 2
C.append(np.extract((cdist(A[:, :2], B[np.newaxis]) > radius), A))
但我意识到 np.extract
使 A
变平,但我没有得到预期的结果。
最佳答案
让R
是这里的半径。如下所述,我们几乎没有办法解决它。
方法#1:使用 cdist
-
from scipy.spatial.distance import cdist
A[(cdist(A[:,:2],B[None]) > R).ravel()]
方法#2:使用 np.einsum
-
d = A[:,:2] - B
out = A[np.einsum('ij,ij->i', d,d) > R**2]
方法#3:使用 np.linalg.norm
-
A[np.linalg.norm(A[:,:2] - B, axis=1) > R]
方法#4:使用matrix-multiplication
与 np.dot
-
A[(A[:,:2]**2).sum(1) + (B**2).sum() - 2*A[:,:2].dot(B) > R**2]
方法 #5: 使用 einsum
的组合和 matrix-multiplication
-
A[np.einsum('ij,ij->i',A[:,:2],A[:,:2]) + B.dot(B) - 2*A[:,:2].dot(B) > R**2]
方法#6:使用broadcasting
-
A[((A[:,:2] - B)**2).sum(1) > R**2]
因此,要获取半径 R
内的点只需替换 >
与 <
在上述解决方案中。
关于python - 根据与点的距离过滤坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47755704/