好的,我最近发现该scipy.spatial.distance.cdist命令可以非常快速地解决源和目标的两个向量数组之间的完整距离矩阵。请参阅:如何使用 numpy 计算欧氏距离?
我想在解决两个相同大小的数组之间的距离时尝试复制这些性能提升。两个 SINGLE 向量之间的距离计算起来相当直接,如上一个链接所示。我们可以采用向量:
import numpy as np
A=np.random.normal(size=(3))
B=np.random.normal(size=(3))
Run Code Online (Sandbox Code Playgroud)
然后使用“numpy.linalg.norm”,其中
np.linalg.norm(A-B)
Run Code Online (Sandbox Code Playgroud)
相当于
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
Run Code Online (Sandbox Code Playgroud)
但是,当我想知道my_distance = distance_between( A[i], B[i] ) for all i第二个解决方案完美运行的两组向量之间的距离时,这很好用。正如预期的那样:
A=np.random.normal(size=(3,42))
B=np.random.normal(size=(3,42))
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
Run Code Online (Sandbox Code Playgroud)
给了我一组 42 个距离的ith 元素A到ith 元素之间的距离B。而该norm函数正确计算整个矩阵的范数,给我一个不是我正在寻找的值。具有 42 个距离的行为是我想要保持的,希望以几乎与我cdist解决完整矩阵所获得的速度一样快。所以问题是使用 python 和 numpy/scipy 计算i具有 shape 的数据之间的距离的最有效方法是什么(n,i)?
谢谢,斯隆
我的任务是创建主类,在其中我将任何点的值初始化为(0,0,0)并且能够分别访问和改变所有三个值(x,y,z).为此,我使用了getter和setter.我的下一个任务是在我的主类(我称之为"distanceTo")中创建一个计算两点之间距离的方法.
如何创建方法" distanceTo",通过获取x,y,z坐标来计算两点之间的距离?我假设我的答案将与某些事情有关,sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2)但我不知道如果我的点在我的第二个测试点类之前没有定义,我怎么能在我的主类中的方法中编写它
到目前为止我只有两点,但我正在寻找一个更一般的答案(所以如果我创建三个点,p1 p2和p3,我可以计算p1和p2之间的距离或p2和p3之间的距离或距离在p1和p3之间.
我的主要课程:
package divingrightin;
public class Point3d {
private double xCoord;
private double yCoord;
private double zCoord;
public Point3d(double x, double y, double z){
xCoord = x;
yCoord = y;
zCoord = z;
}
public Point3d(){
this (0,0,0);
}
public double getxCoord() {
return xCoord;
}
public void setxCoord(double xCoord) {
this.xCoord = xCoord;
}
public double getyCoord() {
return yCoord;
}
public void setyCoord(double yCoord) {
this.yCoord = yCoord;
}
public double …Run Code Online (Sandbox Code Playgroud) 我正在运行代码以生成B中位置的掩码,该掩码比D中的位置更接近A中的位置。
N = [[0 for j in range(length_B)] for i in range(length_A)]
dSquared = D*D
for i in range(length_A):
for j in range(length_B):
if ((A[j][0]-B[i][0])**2 + (A[j][1]-B[i][1])**2) <= dSquared:
N[i][j] = 1
Run Code Online (Sandbox Code Playgroud)
对于长度为数万个位置的A和B的列表,此代码需要一些时间。我很确定有办法矢量化它,但是可以使其运行得更快。谢谢。
我正在与pyspark合作,想知道在数组的一行条目和整个列之间是否有任何聪明的方法来获取欧氏距离。例如,有一个像这样的数据集。
+--------------------+---+
| features| id|
+--------------------+---+
|[0,1,2,3,4,5 ...| 0|
|[0,1,2,3,4,5 ...| 1|
|[1,2,3,6,7,8 ...| 2|
Run Code Online (Sandbox Code Playgroud)
选择一列,即id == 1,然后计算欧几里德距离。在这种情况下,结果应为[0,0,sqrt(1 + 1 + 1 + 9 + 9 + 9)]。有人能找出如何有效地做到这一点吗?谢谢!
我看过另一个StackOverflow线程,它在讨论用于计算欧几里得范数的各种实现,而我很难理解为什么/如何实现特定的实现。
可在MMD度量的实现中找到代码:https : //github.com/josipd/torch-two-sample/blob/master/torch_two_sample/statistics_diff.py
这是一些开始的样板:
import torch
sample_1, sample_2 = torch.ones((10,2)), torch.zeros((10,2))
Run Code Online (Sandbox Code Playgroud)
接下来的部分是我们从上面的代码中提取的内容。我不确定为什么将这些样本连接在一起。
sample_12 = torch.cat((sample_1, sample_2), 0)
distances = pdist(sample_12, sample_12, norm=2)
Run Code Online (Sandbox Code Playgroud)
然后传递给pdist函数:
def pdist(sample_1, sample_2, norm=2, eps=1e-5):
r"""Compute the matrix of all squared pairwise distances.
Arguments
---------
sample_1 : torch.Tensor or Variable
The first sample, should be of shape ``(n_1, d)``.
sample_2 : torch.Tensor or Variable
The second sample, should be of shape ``(n_2, d)``.
norm : float
The l_p norm to be used.
Returns
-------
torch.Tensor …Run Code Online (Sandbox Code Playgroud) 给定m个4维点,找出具有最大欧几里德距离的两个点的有效方法是什么?
目前,我只是使用蛮力方法并使用2个嵌套for循环(O(m ^ 2))检查每对距离,但这是非常糟糕的,因为它不能缩放.
当我给他一个加权图并且顶点之间的边权重指向顶点之间的距离时,是否有一种算法可以给我图中顶点的坐标?
就像是:
public _ArrayOfCoordinatesForVertices_ **super_hyper_algorithm**(weighted_graph){
return _foo_;
}
Run Code Online (Sandbox Code Playgroud) 我试图在Python中计算从A点到B点通过中间点列表的路径长度.我知道怎么做,但我确实想使用reduce Built-in功能.
为什么我到目前为止尝试过,请注意这是完全错误的,是这样的:
reduce(lambda x,y: math.sqrt((y[1]-y[0])**2+(x[1]-x[0])**2) , ((1,2),(3,4),(1,8)))
Run Code Online (Sandbox Code Playgroud)
任何的想法?
谢谢.
我在Python中有以下问题需要解决:
给定两个坐标矩阵 (NumPy ndarrays) A和B,查找中相应坐标向量a中的所有坐标向量,使得欧几里得距离最小。坐标矩阵和可以具有不同数量的坐标向量(即不同的行数)。AbB||a-b||AB
此方法应返回一个坐标向量矩阵,其中中的C第 i 个向量是与中的第 i 个坐标向量的欧几里德距离最小化的向量。cCBaA
例如,假设
A = np.array([[1,1], [3,4]])和B = np.array([[1,2], [3,6], [8,1]])
向量[1,1]inA和向量 in之间的欧几里德距离B为:
1, 5.385165, 7
Run Code Online (Sandbox Code Playgroud)
所以第一个向量C是[1,2]
[3,4]类似地,向量inA和向量 in的距离B为:
2.828427, 2, 5.830952
Run Code Online (Sandbox Code Playgroud)
所以第二个也是最后一个向量C将是[3,6]
所以C = [[1,2], [3,6]]
如何在 Python 中高效地编写此代码?
我正在尝试计算欧几里得距离的矢量化实现(使用内积在 X 和 Y 中的每个元素之间)。数据如下:
X = np.random.uniform(low=0, high=1, size=(10000, 5))
Y = np.random.uniform(low=0, high=1, size=(10000, 5))
Run Code Online (Sandbox Code Playgroud)
我所做的是:
euclidean_distances_vectorized = np.array(np.sqrt(np.sum(X**2, axis=1) - 2 * np.dot(X, Y.T) + np.sum(Y**2, axis=1)))
Run Code Online (Sandbox Code Playgroud)
尽管这给出了“一些输出”,但答案是错误的,因为每行仍然包含 5 个元素。
有谁知道我做错了什么?