我已经使用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]]
我在这里做什么错了?
答案 0 :(得分:0)
由于它是一个numpy数组(如DYZ指出的那样,在原始coo_matrix上调用了.todense()
):
请注意,原始矩阵或2d数组为7 x 7(7行x 7列)。调用col = M[:,3]
时,是说您要第3列和所有行,这是结果7 x 1矩阵(7行乘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]
来获取第二列。