python - 根据与点的距离过滤坐标

标签 python numpy scipy

我有两个数组说:

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/

相关文章:

python - 使用 SQLAlchemy 执行查询时避免参数绑定(bind)

javascript - python3.5 aiohttp,请求post,json格式和405错误

python - 如何按不在数据框中的数组对数据框进行排序

python - 从 scipy 常规网格插值器返回二维数组

python - python 的简单 QR 迭代的特征值不正确

python - 如何向另一个函数发送额外的参数

Python Scrapy,从子页面返回继续抓取

python - 如何在numpy中向量化多个矩阵乘法?

python : ImportError: No module named numpy

python - 找出在 matplotlib 中绘制的两条曲线之间的区域(fill_between area)