python - 矩阵的 numpymultiply() 中出现意外的尖括号 "<"

标签 python numpy scipy

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/

相关文章:

python - 使用 pywin32 在 python 中模拟击键

python - 查找 Pandas 系列中的关键字子集 (Python)

python - Numpy 将二进制字符串解包为单个变量

python - One-hot 向量的 3 维组合

python - 使用 in1d 函数测试数组之间的相等性

python - 计算利率 Python Dataframe

python - 根据行中的条件向数据框中添加列

python - NumPy 数组的转换在数千次循环后变慢

python - scipy.sparse 中缺少 save_npz 方法

python - 哪些 Scipy 模块实际上调用了 Numpy 模块?