python - 如何从布尔索引数组逆向工程原始数组?
问题描述
好的,所以我编写了一些用于向量化对称矩阵的代码,它只获取唯一元素并将它们转换为一维向量,同时还将非对角线元素乘以 root2:
def vectorize_mat(mat):
assert mat.shape[0] == mat.shape[1], 'Matrix is not square'
n = int(mat.shape[0])
vec_len = 0.5*n*(n+1)
weight_mat = (np.tri(n,k=-1)*np.sqrt(2))+np.identity(n)
mask_mat = np.tri(n).astype(bool)
vec_mat = (mat*weight_mat)[mask_mat]
return vec_mat
这真的很好用,现在我想弄清楚如何从向量中重建原始数组。我得到了像这样的原始矩阵尺寸:
v = len(vec_mat)
n = isqrt(2*v)
其中 isqrt() 是整数平方根,来自:Python 中的整数平方根
但我正在为下一步做什么而苦苦挣扎。我现在可以重建权重和掩码矩阵。所以显然我可以向量化权重矩阵并将向量除以它,或者将重建的矩阵除以权重矩阵以撤消该步骤,但我不知道该怎么做的重塑和东西(来自布尔索引) . 也许那里有一些超级简单的答案,但我似乎看不到。
解决方案
回答你的标题问题。索引 - 包括布尔索引 - 可用于分配。
这是一个例子。让我们首先使用遮罩提取下三角形。
>>> a = np.arange(25).reshape(5, 5)
>>> y, x = np.ogrid[:5, :5]
>>> lower = y>=x
>>> b = a[lower]
现在 b 包含下三角形。我们可以使用相同的掩码来重构下三角形并对称地填充上三角形:
>>> recon = np.empty_like(a)
>>> recon[lower] = b
>>> recon.T[lower] = b
>>> recon
array([[ 0, 5, 10, 15, 20],
[ 5, 6, 11, 16, 21],
[10, 11, 12, 17, 22],
[15, 16, 17, 18, 23],
[20, 21, 22, 23, 24]])
推荐阅读
- javascript - 如何在 useEffect 中包含缺少的依赖项但防止函数的无限循环执行?
- r - 在R中使用xpath查找包括变音符号的文本
- c# - 在 C# 记录中缓存昂贵的重新计算属性或字段
- xml - 如果参数无效,XSLT 验证并连接
- twilio - 在添加字母数字发件人 ID 时,我总是在 php 中遇到错误
- azure - 使用 MSAL.js 和 Azure Active Directory 保护 SPA 中的 REST API 调用 - 如何将身份验证令牌传递给承载策略
- http - 如果它们只能是 GET 请求,如何在成功 URL 发送到合作伙伴 API 后更改数据?
- c# - 尝试更改 @page url 但出现错误
- javascript - 带有闰年的日期函数
- python - 从简单的 python 类/函数调用 Boost Python 函数