【问题标题】:How do I extract the lower/upper triangle of a non-square numpy array?如何提取非方形 numpy 数组的下/上三角形?
【发布时间】:2020-07-26 22:48:30
【问题描述】:

所以基本上我有一个数组 subslope 包含以下内容:

import numpy as np
import matplotlib.pyplot as plt

slp = 1501.66*(np.ones((1000,1000), dtype=np.float32))
vsub = 2000*(np.ones((1000,1000), dtype=np.float32))

slope = np.triu(slp)
slope2 = np.tril(vsub, k=-1)
subslope = slope + slope2

这是视觉表示:

您可以看到分隔数组的两个部分的对角线,上半部分在对角线下方的值分别为 1501.66 和 2000。但是,当我更改尺寸以使列数明显大于行数时,如下所示:

slp = 1501.66*(np.ones((1000,2000), dtype=np.float32))
vsub = 2000*(np.ones((1000,2000), dtype=np.float32))

我们得到以下信息:

我想要的是从数组的顶角到底角的对角线,如下所示:

我怎样才能做到这一点?

【问题讨论】:

  • 你将如何“四舍五入”索引。上、下、圆?
  • 我想总结一下
  • 查看np.trinp.triu,了解它们是如何得出索引的。也许您可以根据需要调整它们。

标签: python arrays numpy matplotlib imshow


【解决方案1】:

要生成你的数组,用 nR 行和 nC 列填充:

  • 在与valDiag的对角线,
  • 在对角线上 valUpper,
  • valLower对角线下方,

您可以使用以下功能:

def genDiag(nR, nC, valUpper, valDiag, valLower):
    slope = nC / nR
    tbl = np.full((nR, nC), valDiag, dtype=float)
    for r in range(nR):
        tbl[r, 0 : int(round(slope * r, 0))] = valLower
        tbl[r, int(round(slope * (r + 1), 0)) : nC] = valUpper
    return tbl

要测试它,在较小的数字上运行:

res = genDiag(8, 14, 15.1, 0, 20.2)
print(res)

结果是:

[[ 0.   0.  15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1]
 [20.2 20.2  0.   0.  15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1]
 [20.2 20.2 20.2 20.2  0.  15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1]
 [20.2 20.2 20.2 20.2 20.2  0.   0.  15.1 15.1 15.1 15.1 15.1 15.1 15.1]
 [20.2 20.2 20.2 20.2 20.2 20.2 20.2  0.   0.  15.1 15.1 15.1 15.1 15.1]
 [20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2  0.  15.1 15.1 15.1 15.1]
 [20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2  0.   0.  15.1 15.1]
 [20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2 20.2  0.   0. ]]

如果您希望此表不单独填充对角线, 首先决定是否要填充对角线元素 使用“上”或“下”值,然后将所选值作为 valDiag 传递。

【讨论】:

    【解决方案2】:

    您可以使用np.indices 创建一个布尔掩码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    shape = (1000, 2000)
    i,j = np.indices(shape)
    m = np.ceil(i <= j*shape[0]/shape[1]).astype(bool)
    
    subslope = np.empty(shape, np.float32)
    subslope[m] = 1501.66
    subslope[~m] = 2000
    
    plt.imshow(subslope)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多