使用Pythonic /优雅的方法来用整数序列填充2D数组吗?

时间:2019-02-20 22:18:04

标签: python arrays numpy range

我正在YouTube上观看NumPy的介绍性视频: Intro to Numerical Computing with NumPy

在39:00时间,他开始讨论6x6矩阵的示例,第一行填充:0, 1, ..., 5,第二行填充10, 11, ... , 15,最后一行填充{{ 1}}。

我考虑过使用(1)嵌套的(两层)列表推导,然后将列表列表转换为50, 51, ... , 55对象或(2)< / em>使用numpy.matrix函数内部的变量,即-range,并且将range(x)从1更改为6。我无法使这两个想法都起作用。

下面是我的非矢量化/循环代码,用于构造此矩阵。有没有更Python化的方式来做到这一点?非常感谢!

x

2 个答案:

答案 0 :(得分:4)

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]])

答案 1 :(得分:3)

这可以通过广播来实现,

arange(0, 6) + 10*arange(0, 6)[:, None]

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]])

我建议您阅读https://docs.scipy.org/doc/numpy/user/basics.broadcasting.htmlhttps://docs.scipy.org/doc/numpy/reference/arrays.indexing.html。使用numpy时,“ Pythonic”并不重要。有时迭代,列表推导和其他Python方法可以很好地与数组配合使用,而有时它们效率极低。但是,给出的链接涵盖了一些高级的概念,这些概念对于numpy非常有用。