Python 使用Numpy在空数组中插入行

Python 使用Numpy在空数组中插入行,python,arrays,numpy,Python,Arrays,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(lengt

你好,我正在尝试转换此数组

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.])

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

您可以使用scikit学习获得所有成对曼哈顿距离,从而将上述操作简化为单个函数调用:

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]]

另一种方法是使用Scipy:

from scipy.spatial.distance import cdist
cdist(test,test,'cityblock')
输出:

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

比较

#@ehsan's solution
def m1(test):
  return cdist(test,test,'cityblock')

#@yatu's solution
def m2(test):
  return manhattan_distances(test)

in_ = [np.random.randint(0,10,(n,2)) for n in [10,100,1000,10000]]
对于大型阵列,它们似乎具有类似的性能,但对于较小的阵列(约1000行)m1似乎更快


我知道cdist函数,但此任务的目标是手动校正曼哈顿距离,我只有在附加中遇到问题function@RAbeeq然后我误解了这个问题。你必须使用循环吗?您仍然可以在不使用循环的情况下使用numpy实现它。通常不建议循环数组,循环速度较慢。如果你需要循环,我认为亚图的答案涵盖了它。如果您不必使用循环,我可以用数组帮助实现它。无需,但感谢您的帮助我真的非常感谢您不客气@RAbeeq:)别忘了您可以投票并接受答案。看,谢谢!或者用你原来的。。。z=np.数组([0,1,2,3,1,0,1,4,2,1,0,3,3,4,3,0])和z.重塑(4,4)