首页 > 解决方案 > 使用 Numpy 在空数组中插入行

问题描述

您好,我目前正在尝试转换此数组

test=np.array([[0,0],[0,1],[1,1],[3,0]])

并使用曼哈顿距离将这个数组转换成这个形状

[0., 1., 2., 3.] 
[1., 0., 1., 4.]
[2., 1., 0., 3.,
[3., 4., 3., 0.]

代码是这样的

list_x=[]
newarray=np.array([])
length=len(test)
for i in range(length):
    for j in range(length):
        print('i=',i)
        print('j=',j)
        var=sum(abs(a-b) for a,b in zip(test[i],test[j]))
        list_x.append(var)
    newarray= np.append(newarray,list_x,axis = 0) 
    list_x=[]
    

但代码的结果不断给我这个:

array([0., 1., 2., 3., 1., 0., 1., 4., 2., 1., 0., 3., 3., 4., 3., 0.])

我的 np.append() 中是否存在阻止将其转换为 4*4 形状数组的问题?

标签: pythonarraysnumpy

解决方案


您可以使用 scikit-learnmanhattan_distances获取所有成对的曼哈顿距离,将上述内容简化为单个函数调用:

from sklearn.metrics.pairwise import manhattan_distances

manhattan_distances(test)
array([[0., 1., 2., 3.],
       [1., 0., 1., 4.],
       [2., 1., 0., 3.],
       [3., 4., 3., 0.]])

如果您想使用 for 循环获取距离,我建议您改用 python 列表。为了最终得到一个嵌套列表,生成一个内部列表,其中包含一行与其他行的距离,并在每次迭代时将其附加到外部列表:

out=[]
for i in range(length):
    new_row = []
    for j in range(length):
        var=sum(abs(a-b) for a,b in zip(test[i],test[j]))
        new_row.append(var)
    out.append(new_row)

print(out)
# [[0, 1, 2, 3], [1, 0, 1, 4], [2, 1, 0, 3], [3, 4, 3, 0]]

推荐阅读