创建矩阵
通过传递Python列表的列表给NumPy来创建二维数组(或“矩阵”)。
>>> data = np.array([[1, 2], [3, 4], [5, 6]])
>>> data
array([[1, 2],
[3, 4],
[5, 6]])
在处理矩阵时,索引和切片操作非常有用:
>>> data[0, 1]
2
>>> data[1:3]
array([[3, 4],
[5, 6]])
>>> data[0:2, 0]
array([1, 3])
聚合矩阵的方式与聚合向量的方式相同:
>>> data.max()
6
>>> data.min()
1
>>> data.sum()
21
可以聚合矩阵中的所有值,也可以使用axis参数跨列或行聚合这些值。为了说明这一点,我们来看一个稍微修改过的数据集:
>>> data = np.array([[1, 2], [5, 3], [4, 6]])
>>> data
array([[1, 2],
[5, 3],
[4, 6]])
>>> data.max(axis=0)
array([5, 6])
>>> data.max(axis=1)
array([2, 5, 6])
创建矩阵后,可以使用算术运算符对两个形状(shape)相同的矩阵进行加法和乘法。注:原文是“the same size”是错误的,应该是“the same shape”。
>>> data = np.array([[1, 2], [3, 4]])
>>> ones = np.array([[1, 1], [1, 1]])
>>> data + ones
array([[2, 3],
[4, 5]])
有一种变化情况是其中一个矩阵只有一行或一列,可以认为在加和乘操作之前,NumPy会自动“复制”成形状相同的矩阵后再运算(实际使用广播规则进行操作)。
>>> data = np.array([[1, 2], [3, 4], [5, 6]])
>>> ones_row = np.array([[1, 1]])
>>> data + ones_row
array([[2, 3],
[4, 5],
[6, 7]])
请注意,当NumPy打印N维数组时,最后一个轴绕得最快,而第一个轴绕的最慢。例如:
>>> np.ones((4, 3, 2))
array([[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]]])
通常情况下,只往类似ones()和zeros()这样的函数,以及用于生成随机数的random.Generator类传入生成的元素数,NumPy会初始化成一维数组:
>>> np.ones(3)
array([1., 1., 1.])
>>> np.zeros(3)
array([0., 0., 0.])
>>> rng = np.random.default_rng() # the simplest way to generate random numbers
>>> rng.random(3)
array([0.63696169, 0.26978671, 0.04097352])
如果往ones(),zeros()和random()传入描述矩阵维数的元组(两个整数的元组)时,NumPy初始化成一个2D数组(矩阵):
>>> np.ones((3, 2))
array([[1., 1.],
[1., 1.],
[1., 1.]])
>>> np.zeros((3, 2))
array([[0., 0.],
[0., 0.],
[0., 0.]])
>>> rng.random((3, 2))
array([[0.01652764, 0.81327024],
[0.91275558, 0.60663578],
[0.72949656, 0.54362499]]) # may vary
阅读有关在数组创建例程中填充有0、1、其他值或未初始化值的数组的详细信息,请打开:https://numpy.org/doc/stable/reference/routines.array-creation.html#routines-array-creation。