问题描述
我使用 Scipy 的 coo_matrix 创建了一个二维矩阵,并有一个矩阵 M 如下:
df = pd.DataFrame(columns=["hub", "auth", "weight"])
M = coo_matrix((df.iloc[:,2], (df.iloc[:,0],df.iloc[:,1])), shape=(len(hubs) + len(auths), len(hubs) + len(auths)))
M = M.todense()
[[0 0 0 1 1 1 0]
[0 0 0 1 1 0 0]
[0 0 0 0 0 0 1]
[0 0 0 0 0 0 0]
[0 0 0 0 0 0 0]
[0 0 0 0 0 0 0]
[0 0 0 0 0 0 0]]
我可以成功地对数组进行切片以获取其列和每列中的元素:
col = M[:,3]
val = col[0]
其中 val 等于 1。我尝试做类似的事情来提取一行:
row = M[0]
val = row[2]
这也应该返回 1,但 val 返回
[[0 0 0 1 1 1 0]]
我在这里做错了什么?
1楼
由于它是一个 numpy 数组(正如 DYZ 指出的那样,在原始 coo_matrix 上调用了.todense()
):
请注意,您的原始矩阵或二维数组为 7 x 7(7 行 x 7 列)。
当您调用col = M[:,3]
,您是说您想要第 3 列和所有行,这是一个 7 x 1 矩阵(7 行 x 1 列)。
当您调用col[2]
,您实际上是在调用col[2,:]
或获取第二行(现在只是一个 1 x 1 矩阵)。
现在,如果您调用row = M[0]
,您实际上是在调用row = M[0,:]
或获取第 0 行和所有列,这是一个 1 x 7 矩阵(1 列乘 7 行)。
因此,调用val = row[2]
会产生索引错误,因为您的新矩阵中只有 1 行。
您可以改为调用val = row[:,2]
来获取第二列。