adj.multiply(adj.T > adj)
是如何工作的?
代码运行良好,但我不希望在乘法语句中出现尖括号>
。我相信文档规定为 multiply()
提供两个值,但它仍然可以工作并通过将 (adj.T > adj)
替换为 来生成输出矩阵(True)
、(False)
、(adj.T != adj)
,但不是 (adj.T = adj)
。此外,该 multiply()
方法未附加到变量的末尾,而在此处用作 adj.multiply()
。方法multiply的源代码似乎只是将其转换为csr_matrix并运行numpy的multiply()
,然后IIRC将其转换回coo_matrix。 .T
当然意味着“转置”。
# build symmetric adjacency matrix
adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)`
对于某些上下文,“adj”是来自 graph convolutional network 的 scipy coo_matrix在 github 上,我试图了解如何准备输入。
adj = sp.coo_matrix((np.ones(edges.shape[0]), (edges[:, 0], edges[:, 1])),
shape=(labels.shape[0], labels.shape[0]),
dtype=np.float32)
尝试重现代码需要运行整个页面。
以下内容更容易重新创建和测试:
import numpy as np
import scipy.sparse as sp
asdf = sp.coo_matrix((np.ones(5), (np.ones(5), np.ones(5))), shape=(5,5),
dtype=np.float32)
print(asdf)
print(asdf.toarray())
asdf = asdf + asdf.T.multiply(asdf.T > asdf) - asdf.multiply(asdf.T > asdf)
print("asdf")
print(asdf.toarray())
at row=1,col=1,值为 5,其中 asdf.T.multiply(True)
语句将其值 5 加倍,达到 10。传递两个用空格或逗号分隔的变量不起作用。
更新:
我在“">”尖括号之前放置了一个数字(不是整个矩阵),它产生了以下错误:
/usr/local/lib/python3.6/dist-packages/scipy/sparse/compressed.py:287: SparseEfficiencyWarning: Comparing a sparse matrix with a scalar greater than zero using < is inefficient, try using >= instead. warn(bad_scalar_msg, SparseEfficiencyWarning)
看到这一点,我意识到有一个不同的稀疏multiply()方法,如果没有明确输入“sparse”,谷歌中不会显示该方法。它的documentation is here ,但我不知道它如何处理尖括号或条件。
最佳答案
记录此问题。
当我尝试处理有关这行代码的困惑时:
adj = adj + adj.T.multiply(adj.T > adj) - adj.multiply(adj.T > adj)
我需要理解三个部分:
<强>1。 adj.T > adj
它构建了一个与矩阵 adj 形状相同的 bool 类型矩阵。
<强>2。乘法()
该函数实际上实现的是Hadamard积,而不是Dot积。官方文档给出了描述:“与另一个矩阵进行逐点乘法”。
<强>3。对称邻接矩阵的构建方法
我们最好保留(i, j)和(j, i)之间较大的权重项,而不是简单地将它们相加,因为后者会增加边的权重。
有代码来解释它们:
import numpy as np
import scipy.sparse as sp
row = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
col = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2])
A = sp.coo_matrix(([0, 3, 2, 0, 0, 0, 7, 4, 0], (row, col)),
shape=(3, 3), dtype=np.float32)
print(A.toarray())
print((A.T > A).toarray())
print(A.T.multiply(A.T > A).toarray())
A = A + A.T.multiply(A.T > A) - A.multiply(A.T > A)
print("The symmetric adjacency matrix:", A.toarray(), sep='\n')
关于python - 矩阵的 numpymultiply() 中出现意外的尖括号 "<",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59580369/