我有一个包含int值的向量,如下所示:
v=[10,8,6]
我想要的是创建一个m*m矩阵,存储这些元素之间的距离,即取向量的每个元素,然后从所有其他元素中减去它,所以最后我将得到:
m[3][3]=10-10 10-8 10-6
8-10 8-8 8-6
6-10 6-8 6-6
我想在Python中实现它,但不使用NumPy。到目前为止,我已经这样做了:
def main():
v=[10,8,6]
l=len(v)
m=[]
#filling the matrix
for i in range(0,l-1):
for j in range(0,l-1):
m[i][j]=abs(v[i]-v[j])
#visualize the matrix
for i in range(0,l-1):
for j in range(0,l-1):
print m[i][j]
但是我得到了一些错误,不能识别m的界限。为什么?
发布于 2011-11-14 04:23:49
v= [10,8,6]
m = [[abs(y-x) for y in v] for x in v]
编辑:
要获得漂亮的打印效果,您可以使用如下内容:
for i in m:
print '%s '*len(i) % tuple(i)
发布于 2011-11-14 04:47:17
您需要为信封列表中的每一行创建一个列表。我使用了一个双重列表来理解m,然后使格式更美观一些,以便打印出矩阵。另外,注意你的索引:记住,范围是从第一个索引到第一个索引减去传递给它的第二个索引。您还可以对m中的每一行执行print ' '.join(row)
,以便将其很好地打印出来。
def main():
v=[10,8,6]
l=len(v)
#filling the matrix
m=[[abs(x - y) for y in v] for x in v]
#visualize the matrix
for i in range(0,l):
for j in range(0,l):
print m[i][j],
print
main()
结果:
0 2 4
2 0 2
4 2 0
发布于 2011-11-14 05:00:39
你的列表一开始就是空的。您不能对列表中的元素进行索引。解决这个问题的一种方法是创建列表,然后追加它们。
m=[]
#filling the matrix
for i in range(0,l-1):
x = []
for j in range(0,l-1):
x.append( abs(v[i]-v[j]) )
m.append(x)
或者,您可以创建矩阵,然后填充它
m=[[0] *l for x in range(l)]
#filling the matrix
for i in range(0,l-1):
for j in range(0,l-1):
m[i][j]=abs(v[i]-v[j])
更好的是其他人所展示的列表理解
m = [[abs(y-x) for y in v] for x in v]
但是,我会使用numpy/scipy
m = scipy.spatial.distance.pdist(v)
https://stackoverflow.com/questions/8114425
复制相似问题