Skip to main content
 首页 » 编程设计

python之用整数序列填充二维数组的更 Pythonic/优雅的方法

2025年05月04日13yxwkf

我想创建一个 6x6 numpy 矩阵,第一行填充:0, 1, ..., 5,第二行填充 10, 11, .. . , 15,最后一行填入 50, 51, ... , 55。

我考虑过使用 (1) 嵌套(两层)列表理解,然后将列表的列表转换为 numpy.matrix 对象,或者 (2) 在 range 函数内使用变量,即 - range(x) 并将 x 从 1 变为 6。我无法让这两个想法中的任何一个发挥作用。

下面是我构建这个矩阵的非矢量化/循环代码。有没有更 Pythonic 的方式来做到这一点?

a = np.zeros((6,6)) 
for i in range(6): 
    for j in range(6): 
        a[i,j] = 10*i + j 
print(a) 

(这是 39:00 在 Youtube 上 NumPy 的介绍视频中给出的示例之一: Intro to Numerical Computing with NumPy

请您参考如下方法:

np.ogrid怎么样? ?

np.add(*np.ogrid[:60:10, :6])  
 
# array([[ 0,  1,  2,  3,  4,  5], 
#        [10, 11, 12, 13, 14, 15], 
#        [20, 21, 22, 23, 24, 25], 
#        [30, 31, 32, 33, 34, 35], 
#        [40, 41, 42, 43, 44, 45], 
#        [50, 51, 52, 53, 54, 55]]) 

详情
ogrid 返回一个开放的网格:

a, b = np.ogrid[:60:10, :6] 
a 
 
# array([[ 0], 
#        [10], 
#        [20], 
#        [30], 
#        [40], 
#        [50]]) 
 
b 
# array([[0, 1, 2, 3, 4, 5]]) 

然后您可以执行广播加法:

# a + b 
np.add(a, b) 
 
# array([[ 0,  1,  2,  3,  4,  5], 
#        [10, 11, 12, 13, 14, 15], 
#        [20, 21, 22, 23, 24, 25], 
#        [30, 31, 32, 33, 34, 35], 
#        [40, 41, 42, 43, 44, 45], 
#        [50, 51, 52, 53, 54, 55]]) 

同样,你也可以使用np.arange生成两个范围并相加:

np.arange(0, 60, 10)[:,None] + np.arange(6) 
 
# array([[ 0,  1,  2,  3,  4,  5], 
#        [10, 11, 12, 13, 14, 15], 
#        [20, 21, 22, 23, 24, 25], 
#        [30, 31, 32, 33, 34, 35], 
#        [40, 41, 42, 43, 44, 45], 
#        [50, 51, 52, 53, 54, 55]])