Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3.3 Numpy的二维数组

1. 创建二维数组

如何创建一个二维数组呢? 你可以传递Python列表来创建一个2d数组(或“矩阵”)。

import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
data
array([[1, 2], [3, 4], [5, 6]])
np_create_matrix

在一维数组的创建中,我们已经学会ones(), zeros()和random(),当然也可以使用ones(), zeros()和random()来创建一个2D数组,如果你给他们一个元组来描述矩阵的维数:

np_ones_zeros_matrix

1.1 数组的形状和尺寸

ndarray.ndim 会告诉你数组的轴数,或者说是维度。

ndarray.size 会告诉你数组元素的总数。这是数组的形状元素的乘积。

ndarray.shape 将显示一个整数元组,该元组指示数组每个维度上存储的元素数量。

# array_example是一个3维数组
import numpy as np
array_example = np.array([[[0, 1, 2, 3],
                           [4, 5, 6, 7]],
                          [[0, 1, 2, 3],
                           [4, 5, 6, 7]],
                          [[0 ,1 ,2, 3],
                           [4, 5, 6, 7]]])
print('维度:', array_example.ndim)
print('尺寸:', array_example.size)
print('形状:', array_example.shape)
维度: 3
尺寸: 24
形状: (3, 2, 4)

猜猜看以下数组的ndim、size、shape

# 2维数组
array_example = np.array([[0, 1, 2, 3],
                          [4, 5, 6, 7],
                          [0, 1, 2, 3],
                          [4, 5, 6, 7],
                          [0 ,1 ,2, 3],
                          [4, 5, 6, 7]])
print('维度:', array_example.ndim)
print('尺寸:', array_example.size)
print('形状:', array_example.shape)
维度: 2
尺寸: 24
形状: (6, 4)

2. 索引和切片

当你在操作矩阵时,索引和切片操作很有用:

np_matrix_indexing
data = np.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])

2.1 满足特定条件的切片

如果想从数组中选择满足特定条件的值,使用NumPy很简单。

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
a
array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]])

从a中选取小于10的子集:

below_five = a[a < 10]
below_five
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

或者是选取可以被2整除的子集:

divisible_by_2 = a[a%2==0]            # %整除,求余数
divisible_by_2
array([ 2, 4, 6, 8, 10, 12])

选取满足多组条件下的子集:

a[(a > 2) & (a < 11)]
array([ 3, 4, 5, 6, 7, 8, 9, 10])

3. 求和、最大值、最小值

和一维数组一样,二维数组的求最大值、最小值和总和,如下:

np_matrix_aggregation

你可以在一个矩阵中聚合所有的值,你可以使用轴参数跨列或跨行聚合它们:

np_matrix_aggregation_row
import numpy as np
data = np.array([[1, 2], [5, 3], [4, 6]])
data.max(axis=0)
array([5, 6])
data.max(axis=1)
array([2, 5, 6])

一旦你创建了你的矩阵,如果你有两个相同大小的矩阵,你可以使用算术运算符对它们进行相加和相乘

np_matrix_arithmetic

你可以在不同大小的矩阵上做这些算术运算,但只有当一个矩阵只有一列或一行。在本例中,NumPy将使用它的广播规则进行操作。

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

4. 转置

通常需要对2维数组进行转置。NumPy数组有一个属性T,它允许转置

np_transposing_reshaping
data
array([[1, 2], [3, 4], [5, 6]])
data.T
array([[1, 3, 5], [2, 4, 6]])

5. 变形

你可能还需要变换矩阵的维数。例如,当您有一个模型,它需要一个与您的数据集不同的输入形状时,就会发生这种情况。这就是重塑方法可以发挥作用的地方。你只需要传递你想要的矩阵的新维度。

np_reshape

如果想把2维数组变成1维,该如何操作呢?

x = np.array([[1 , 2, 3, 4],
              [5, 6, 7, 8],
              [9, 10, 11, 12]])
x.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

6. 连结两个数组

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

可以使用np.concatenate()将它们连接起来。

np.concatenate((a, b))        #或者使用np.concatenate([a, b])
array([1, 2, 3, 4, 5, 6, 7, 8])

或者是另一个方向,

x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6]])
x
array([[1, 2], [3, 4]])
y
array([[5, 6]])

你把它们拼接在一起

np.concatenate((x, y), axis=0) 
array([[1, 2], [3, 4], [5, 6]])

7. 参考

  1. NumPy: the absolute basics for beginners, https://numpy.org/doc/stable/user/absolute_beginners.html

  2. A Visual Intro to NumPy and Data Representation, https://jalammar.github.io/visual-numpy/