如何获取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
相关产品推荐
相关产品推荐

