我正在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
答案 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.html和https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html。使用numpy时,“ Pythonic”并不重要。有时迭代,列表推导和其他Python方法可以很好地与数组配合使用,而有时它们效率极低。但是,给出的链接涵盖了一些高级的概念,这些概念对于numpy非常有用。