Skip to main content
 首页 » 编程设计

python之用于生成 NumPy 矩阵的矢量化解决方案

2025年05月04日12wayfarer

我正在寻找一些内置的 NumPy 模块或一些矢量化方法来通过 n 矩阵为 n>1 获得这样的 n。这里唯一的关键是给定行的最后一个元素充当下一行的第一个元素。

n = 2 
# array([[1, 2],  
#        [2, 3]]) 
 
n = 3 
# array([[1, 2, 3],  
#        [3, 4, 5],  
#        [5, 6, 7]]) 
 
n = 4 
# array([[1, 2, 3, 4],  
#        [4, 5, 6, 7],  
#        [7, 8, 9, 10],  
#        [10, 11, 12, 13]]) 

我的尝试 使用列表理解。也可以用扩展的 for 循环语法编写相同的内容。

import numpy as np 
n = 4 
arr = np.array([[(n-1)*j+i for i in range(1, n+1)] for j in range(n)]) 
# array([[ 1,  2,  3,  4], 
#        [ 4,  5,  6,  7], 
#        [ 7,  8,  9, 10], 
#        [10, 11, 12, 13]]) 

请您参考如下方法:

如果你想让事情简单(并且有点可读),应该这样做:

def ranged_mat(n): 
    out = np.arange(1, n ** 2 + 1).reshape(n, n) 
    out -= np.arange(n).reshape(n, 1) 
    return out 

只需构建从 1 到 n² 的所有数字,将它们重新整形为所需的 block 形状,然后从每一行中减去行号。

这与 Divakar 的 ranged_mat_v2 相同,但我喜欢明确显示中间数组形状。并非每个人都是 NumPy 广播规则的专家。