You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取numpy数组沿左下到右上45度对角线的上下部分?

沿左下到右上对角线分割Numpy矩阵的上/下三角部分

方法一:直接按行列索引和提取元素

对于n×n的矩阵,沿左下到右上的对角线满足行索引i + 列索引j = n-1。对应你需要的两部分:

  • 第一部分(包含[1,2,3],[4,5],[7]):取i + j ≤ n-1的元素
  • 第二部分(包含[6],[8,9]):取i + j > n-1的元素

代码示例:

import numpy as np

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
n = a.shape[0]

# 获取第一部分(列表形式)
upper_part = [a[i, :n - i] for i in range(n)]
print(upper_part)  # 输出: [array([1, 2, 3]), array([4, 5]), array([7])]

# 获取第二部分(过滤空行后的列表形式)
lower_part = []
for i in range(n):
    segment = a[i, n - i:]
    if len(segment) > 0:
        lower_part.append(segment)
print(lower_part)  # 输出: [array([6]), array([8, 9])]

如果需要保留矩阵结构(用0填充无关位置),可以用掩码实现:

# 生成第一部分的掩码
mask_upper = np.fromfunction(lambda i, j: i + j <= n-1, a.shape)
upper_matrix = np.where(mask_upper, a, 0)
print(upper_matrix)
# 输出:
# [[1 2 3]
#  [4 5 0]
#  [7 0 0]]

# 生成第二部分的掩码
mask_lower = np.fromfunction(lambda i, j: i + j > n-1, a.shape)
lower_matrix = np.where(mask_lower, a, 0)
print(lower_matrix)
# 输出:
# [[0 0 0]
#  [0 0 6]
#  [0 8 9]]

方法二:结合np.fliplr与np.triu/np.tril

利用列反转操作,将左下到右上的对角线转换为左上到右下的标准对角线,再用你熟悉的triu/tril函数处理,最后反转回来:

# 沿左下到右上的上三角(包含对角线)
upper_triu = np.fliplr(np.triu(np.fliplr(a)))
print(upper_triu)
# 输出:
# [[1 2 3]
#  [4 5 0]
#  [7 0 0]]

# 沿左下到右上的下三角(不包含对角线)
lower_tril = np.fliplr(np.tril(np.fliplr(a), k=-1))
print(lower_tril)
# 输出:
# [[0 0 0]
#  [0 0 6]
#  [0 8 9]]

如果需要提取每行的非零元素,只需对结果矩阵遍历处理即可:

upper_elements = [row[row != 0] for row in upper_triu]
lower_elements = [row[row != 0] for row in lower_tril if np.any(row != 0)]

内容的提问来源于stack exchange,提问作者user3490622

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:22:34