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

时间:2017-05-09 21:40:00

标签: 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 in range(len(string1)+1)]

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

以下是所需和当前结果的样子(它是列表列表):

print(Dist)
    [[0, 1, 2, 3], 
    [1, 0, 0, 0], 
    [2, 0, 0, 0], 
    [3, 0, 0, 0], 
    [4, 0, 0, 0], 
    [5, 0, 0, 0]]

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

我的主要问题是,如果我做得对(我认为没有)以及如何做得更好。任何甚至一般的建议都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

由于您已标记为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)

答案 1 :(得分:4)

如何将np.arange分配给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]])

答案 2 :(得分:3)

由于我们的目标是 elegancy ,这里有一个np.ogrid的紧凑版本为我们设置范围数组,然后我们可以分配第一行和列一步 -

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