Python 如何优雅地创建以行和列索引作为第一行/列的矩阵?

Python 如何优雅地创建以行和列索引作为第一行/列的矩阵?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我很难为特定数量的行和列创建矩阵,该矩阵包含分别作为第一行或第一列的索引 # At first I create list of lists with 0 at every position string1 = "dog" string2 = "hippo" Dist = [[0 for column in range(len(string1)+1)] for row in range(len(string2)+1)] 如果可能,我想简化这一步骤: Dist[0] = [x for x

我很难为特定数量的行和列创建矩阵,该矩阵包含分别作为第一行或第一列的索引

# At first I create list of lists with 0 at every position

string1 = "dog"
string2 = "hippo"

Dist = [[0 for column in  range(len(string1)+1)] for row in range(len(string2)+1)]
如果可能,我想简化这一步骤:

Dist[0] = [x for x in range(len(string1)+1)]

for x in range(len(string2)+1):
        Dist[x][0] = x
下面是所需和当前结果的样子(这是一个列表列表):

我计划在距离计算问题中使用这个矩阵,但这是一个单独的部分,我不需要解决


我的主要问题是,我是否做得对(我认为不是),以及如何做得更好。任何建议,即使是一般性建议,都将不胜感激。

因为您已经标记了
numpy
,这里有一个
numpy
选项:

n_cols, n_rows = len(string1)+1, len(string2)+1
Dist = np.zeros((n_rows, n_cols), dtype=np.int32)

Dist[0,:] = np.arange(n_cols)
Dist[:,0] = np.arange(n_rows)
Dist
#array([[0, 1, 2, 3],
#       [1, 0, 0, 0],
#       [2, 0, 0, 0],
#       [3, 0, 0, 0],
#       [4, 0, 0, 0],
#       [5, 0, 0, 0]], dtype=int32)

np.arange
s分配给
np.zero
数组怎么样

>>> import numpy as np

>>> x = 6
>>> y = 4
>>> arr = np.zeros((x, y), dtype=int)
>>> arr[0, :] = np.arange(y)
>>> arr[:, 0] = np.arange(x)
>>> arr
array([[0, 1, 2, 3],
       [1, 0, 0, 0],
       [2, 0, 0, 0],
       [3, 0, 0, 0],
       [4, 0, 0, 0],
       [5, 0, 0, 0]])
因为我们的目标是优雅,这里有一个紧凑的版本,它为我们设置范围数组,然后我们可以一步分配第一行和第一列-

L1,L2 = len(string1)+1, len(string2)+1
Dist1 = np.zeros((L2,L1),dtype=int)
Dist1[:,[0]], Dist1[0] = np.ogrid[:L2,:L1]
样本输出-

In [76]: Dist1
Out[76]: 
array([[0, 1, 2, 3],
       [1, 0, 0, 0],
       [2, 0, 0, 0],
       [3, 0, 0, 0],
       [4, 0, 0, 0],
       [5, 0, 0, 0]])

谢谢,这就是我要找的。我接受这个答案是因为它比MSeiferts高,尽管你们两人在同一分钟回答。你们确定你们不只是想要三个独立的(对齐的)数组,它们的形状是
(1,5)
(3,1)
,和
(3,5)
?为什么要把它们堆在一起?
In [76]: Dist1
Out[76]: 
array([[0, 1, 2, 3],
       [1, 0, 0, 0],
       [2, 0, 0, 0],
       [3, 0, 0, 0],
       [4, 0, 0, 0],
       [5, 0, 0, 0]])