我有一个大型数据框(例如15k对象),其中每一行都是一个对象,列是数字对象的特征.它的形式如下:
df = pd.DataFrame({ 'A' : [0, 0, 1],
'B' : [2, 3, 4],
'C' : [5, 0, 1],
'D' : [1, 1, 0]},
columns= ['A','B', 'C', 'D'], index=['first', 'second', 'third'])
Run Code Online (Sandbox Code Playgroud)
我想计算所有对象(行)的成对距离,并且由于其计算效率,读取scipy的pdist()函数是一个很好的解决方案.我可以简单地打电话:
res = pdist(df, 'cityblock')
res
>> array([ 6., 8., 4.])
Run Code Online (Sandbox Code Playgroud)
并且看到res数组按以下顺序包含距离:[first-second, first-third, second-third].
我的问题是如何在矩阵,数据帧或(不太理想的)dict格式中得到它,所以我确切地知道每个距离值属于哪一对,如下所示:
first second third
first 0 - -
second 6 0 -
third 8 4 0
Run Code Online (Sandbox Code Playgroud)
最后,我认为将距离矩阵作为pandas DataFrame可能很方便,因为我可以对每行应用一些排序和排序操作(例如,找到最靠近对象的N个最近的对象first).
我有两个清单
available_points = [[2,3], [4,5], [1,2], [6,8], [5,9], [51,35]]
和
solution = [[3,5], [2,1]]
我想弹出一个点available_points,并追加它solution用于从该点欧氏距离在总和,所有点solution是最大的.
所以,我会得到这个
solution = [[3,5], [2,1], [51,35]]
我能够选择这样的最初的2个最远点,但不知道如何继续.
import numpy as np
from scipy.spatial.distance import pdist, squareform
available_points = np.array([[2,3], [4,5], [1,2], [6,8], [5,9], [51,35]])
D = squareform(pdist(available_points)
I_row, I_col = np.unravel_index(np.argmax(D), D.shape)
solution = available_points[[I_row, I_col]]
Run Code Online (Sandbox Code Playgroud)
这给了我
solution = array([[1, 2], [51, 35]])
所以,我有一个numpy字符串数组,我想用这个函数计算每对元素之间的成对编辑距离:来自http://docs.scipy.org/doc/scipy的 scipy.spatial.distance.pdist -0.13.0 /参考/生成/ scipy.spatial.distance.pdist.html
我的数组样本如下:
>>> d[0:10]
array(['TTTTT', 'ATTTT', 'CTTTT', 'GTTTT', 'TATTT', 'AATTT', 'CATTT',
'GATTT', 'TCTTT', 'ACTTT'],
dtype='|S5')
Run Code Online (Sandbox Code Playgroud)
但是,因为它没有'editdistance'选项,所以我想给出一个自定义的距离函数.我试过这个,我遇到了以下错误:
>>> import editdist
>>> import scipy
>>> import scipy.spatial
>>> scipy.spatial.distance.pdist(d[0:10], lambda u,v: editdist.distance(u,v))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/epd-7.3.2/lib/python2.7/site-packages/scipy/spatial/distance.py", line 1150, in pdist
[X] = _copy_arrays_if_base_present([_convert_to_double(X)])
File "/usr/local/epd-7.3.2/lib/python2.7/site-packages/scipy/spatial/distance.py", line 153, in _convert_to_double
X = np.double(X)
ValueError: could not convert string to float: TTTTT
Run Code Online (Sandbox Code Playgroud) 我有一个包含 300 万个点的 numpy 数组,格式为[pt_id, x, y, z]. 目标是返回具有欧几里德距离两个数字min_d和 的所有点对max_d。
欧几里得距离在x和之间,y而不是在 上z。但是,我想保留带有pt_id_from, pt_id_to,distance属性的数组。
我正在使用 scipy 的 dist 来计算距离:
import scipy.spatial.distance
coords_arr = np.array([['pt1', 2452130.000, 7278106.000, 25.000],
['pt2', 2479539.000, 7287455.000, 4.900],
['pt3', 2479626.000, 7287458.000, 10.000],
['pt4', 2484097.000, 7292784.000, 8.800],
['pt5', 2484106.000, 7293079.000, 7.300],
['pt6', 2484095.000, 7292891.000, 11.100]])
dists = scipy.spatial.distance.pdist(coords_arr[:,1:3], 'euclidean')
np.savetxt('test.out', scipy.spatial.distance.squareform(dists), delimiter=',')
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能返回一个表单数组:[pt_id_from, pt_id_to, distance]?
我使用pdist命令查找存储在矩阵中的x和y坐标之间的距离.
X = [100 100;
0 100;
100 0;
500 400;
300 600;];
D = pdist(X,'euclidean')
Run Code Online (Sandbox Code Playgroud)
返回15个元素向量.:
[0.734979755525412 3.40039811339820 2.93175207511321 1.83879677592575 2.40127440268306 2.75251513299386 2.21488402640753 1.10610649500317 1.81674017301699 0.903207751535635 1.99116952754924 1.05069952386082 1.24122819418333 1.08583377275532 1.38729428638035]
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些距离与它们的坐标相关联,即将它们存储在具有一般行形式的矩阵中:
[Length xcoordinate1 ycoordinate1 xcoordinate2 ycoordinate2]
Run Code Online (Sandbox Code Playgroud)
找到每个长度的行?
提前致谢
如何计算Python中字符串的Jaro Winkler距离矩阵?
我有大量手工输入的字符串(名称和记录号),我试图在列表中找到重复项,包括可能在拼写上有轻微变化的重复项.一到类似的问题的回答使用SciPy的的pdist功能与定制距离函数建议.我试图用Levenshtein包中的jaro_winkler函数实现这个解决方案.这个问题是jaro_winkler函数需要字符串输入,而pdict函数似乎需要2D数组输入.
例:
import numpy as np
from scipy.spatial.distance import pdist
from Levenshtein import jaro_winkler
fname = np.array(['Bob','Carl','Kristen','Calr', 'Doug']).reshape(-1,1)
dm = pdist(fname, jaro_winkler)
dm = squareform(dm)
Run Code Online (Sandbox Code Playgroud)
预期输出 - 这样的事情:
Bob Carl Kristen Calr Doug
Bob 1.0 - - - -
Carl 0.0 1.0 - - -
Kristen 0.0 0.46 1.0 - -
Calr 0.0 0.93 0.46 1.0 -
Doug 0.53 0.0 0.0 0.0 1.0
Run Code Online (Sandbox Code Playgroud)
实际错误:
jaro_winkler expected two Strings or two Unicodes
Run Code Online (Sandbox Code Playgroud)
我假设这是因为jaro_winkler函数看到的是ndarray而不是字符串,我不知道如何在pdist函数的上下文中将函数输入转换为字符串.
有没有人建议允许这个工作?提前致谢!
我有一个 nd 数组,如下所示:
[[ 0. 1.73205081 6.40312424 7.21110255 2.44948974]
[ 1.73205081 0. 5.09901951 5.91607978 1. ]
[ 6.40312424 5.09901951 0. 1. 4.35889894]
[ 7.21110255 5.91607978 1. 0. 5.09901951]
[ 2.44948974 1. 4.35889894 5.09901951 0. ]]
Run Code Online (Sandbox Code Playgroud)
该数组中的每个元素都是一个距离,我需要将其转换为包含行、列、距离的列表,如下所示:
l = [(0,0,0),(0,1, 1.73205081),(0,2, 6.40312424),...,(1,0, 1.73205081),(1,1,0),...,(4,4,0)]
Run Code Online (Sandbox Code Playgroud)
此外,删除对角线元素会很酷,而且元素 (j,i) 因为 (i,j) 已经存在。本质上,是否可以只取它的顶部三角矩阵?
这是否可以有效地完成(没有很多循环)?我用 squareform 创建了这个数组,但找不到任何文档来执行此操作。
pdist ×7
python ×5
scipy ×5
numpy ×4
jaro-winkler ×1
lambda ×1
matlab ×1
matrix ×1
pandas ×1
python-2.7 ×1
python-3.x ×1
string ×1