【数据分析:工具篇】NumPy(3)NumPy深度使用详解-2

  • NumPy深度使用详解-2
  • 数组的切片
  • 常规切片方法
  • 高级切片方法
  • 数组操作
  • 调整形状
  • 连接数组
  • 分割数组
  • 数组展平
  • 维度转置
  • 最大值的索引
  • 最小值的索引
  • 总结


NumPy深度使用详解-2

NumPy是Python的一个常用科学计算库,它是Numerical Python的缩写。它的核心是一个多维数组对象(ndarray),这个对象是一个快速而灵活的容器,可以用于大量数据集和矩阵计算。

数组的切片

切片是指对数组进行子集的选择,可以对多维数组进行操作。

当我们使用NumPy处理数据时,切片操作是非常常见的。下面是一些常见的NumPy数组切片操作的案例:

常规切片方法

  • 选择一个二维数组的第一行:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
first_row = arr[0,:]
print(first_row) # [1, 2, 3]

python numpy二维数组每行循环 numpy 遍历二维数组_数组

  • 选择一个二维数组的第一列:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
first_column = arr[:,0]
print(first_column) # [1, 4, 7]

python numpy二维数组每行循环 numpy 遍历二维数组_二维数组_02

  • 选择一个二维数组的前两行:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
first_two_rows = arr[:2,:]
print(first_two_rows) # [[1, 2, 3], [4, 5, 6]]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_03

  • 选择一个二维数组的后两列:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
last_two_columns = arr[:,-2:]
print(last_two_columns) # [[2, 3], [5, 6], [8, 9]]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_04

  • 选择一个三维数组的第一个二维数组的前两行:
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
first_two_rows = arr[0,:2,:]
print(first_two_rows) # [[1, 2, 3], [4, 5, 6]]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_05

高级切片方法

  • 使用步长对数组进行切片:
arr1 = np.array([1, 2, 3, 4, 5, 6])
sliced_arr1 = arr1[::2] #从0开始步长为2,选出 1 3 5 
print(sliced_arr1) # [1, 3, 5]

arr2 = np.array([[1, 2, 3], [4, 5, 6],[7, 8, 9], [10, 11, 12]])
sliced_arr2 = arr2[::2] #从0开始步长为2
print(sliced_arr2)

python numpy二维数组每行循环 numpy 遍历二维数组_数组_06

  • 选择一个数组中满足条件的元素:
arr1 = np.array([1, 2, 3, 4, 5, 6])
sliced_arr1 = arr1[arr1 > 3]
print(sliced_arr1) # [4, 5, 6]

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

python numpy二维数组每行循环 numpy 遍历二维数组_数组_07

  • 使用多个条件对数组进行切片:
arr = np.array([1, 2, 3, 4, 5, 6])
condition1 = arr > 2
condition2 = arr < 5
condition = np.logical_and(condition1, condition2)
sliced_arr = arr[condition]
print(sliced_arr) # [3, 4]

python numpy二维数组每行循环 numpy 遍历二维数组_二维数组_08

  • 使用花式索引对数组进行切片:
arr = np.array([1, 2, 3, 4, 5, 6])
index = [0, 3, 5]
sliced_arr = arr[index]
print(sliced_arr) # [1, 4, 6]

python numpy二维数组每行循环 numpy 遍历二维数组_NumPy_09

  • 使用布尔掩码选择数组中满足条件的元素:
arr = np.array([1, 2, 3, 4, 5, 6])
mask = np.array([True, False, True, False, True, False])
sliced_arr = arr[mask]
print(sliced_arr) # [1, 3, 5]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_10

  • 选择一个二维数组的斜对角线元素:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diagonal = arr.diagonal()
print(diagonal) # [1, 5, 9]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_11

  • 选择一个二维数组的副对角线元素:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diagonal = np.fliplr(arr).diagonal()
print(diagonal) # [3, 5, 7]

python numpy二维数组每行循环 numpy 遍历二维数组_二维数组_12

  • 对数组进行切片并修改切片后的值:
arr = np.array([1, 2, 3, 4, 5, 6])
sliced_arr = arr[2:5]
sliced_arr[:] = 0
print(sliced_arr) # [0, 0, 0]
print(arr) # [1, 2, 0, 0, 0, 6]

python numpy二维数组每行循环 numpy 遍历二维数组_数组_13

  • 使用where()函数对数组进行切片:
arr = np.array([1, 2, 3, 4, 5, 6])
sliced_arr = np.where(arr > 3, arr, 0)
print(sliced_arr) # [0, 0, 0, 4, 5, 6]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_14

数组操作

NumPy提供了许多用于操作数组的函数,例如:reshape、concatenate、split、flatten等。这些函数使得数组的操作变得更加容易和灵活。

调整形状

reshape函数:将一个数组重新调整为指定的形状。例如:

# 创建一个二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)

# 使用reshape函数将其转换为一个三行两列的数组
b = a.reshape(3, 2)
print(b)

输出内容:

[[1 2 3]
 [4 5 6]]
[[1 2]
 [3 4]
 [5 6]]

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_15

连接数组

concatenate函数:将两个或多个数组沿指定轴连接起来。例如:

# 创建两个一维数组
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
print(a1)
print(a2)

# 使用concatenate函数将它们连接起来
b = np.concatenate([a1, a2])
print(b)

# 创建两个二维数组
c1 = np.array([[1, 2, 3], [4, 5, 6]])
c2 = np.array([[7, 8, 9], [10, 11, 12]])
print(c1)
print(c2)

# 使用concatenate函数将它们连接起来
d = np.concatenate([c1, c2])
print(d)

输出内容:

[1 2 3]
[4 5 6]
[1 2 3 4 5 6]
[[1 2 3]
 [4 5 6]]
[[ 7  8  9]
 [10 11 12]]
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

python numpy二维数组每行循环 numpy 遍历二维数组_NumPy_16

分割数组

split函数:将一个数组沿指定轴分割成多个子数组。例如:

# 创建一个一维数组
a1 = np.array([1, 2, 3, 4, 5, 6])
# 使用split函数将其分割成三个子数组
b1 = np.split(a1, 3)
print(b1)

# 创建一个二维数组
a2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 使用split函数将其分割成三个子数组
b2 = np.split(a2, 2)
print(b2)

输出内容:

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

python numpy二维数组每行循环 numpy 遍历二维数组_数据科学_17

数组展平

flatten函数:将一个多维数组展平成一维数组。例如:

# 创建一个二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
# 使用flatten函数将其展平成一维数组
b = a.flatten()
print(b)

# 创建一个三维数组
c = np.array([[[1, 2, 3], [4, 5, 6]], [[11, 12, 13], [14, 15, 16]]])
print(c)
# 使用flatten函数将其展平成一维数组
d = c.flatten()
print(d)

输出内容:

[[1 2 3]
 [4 5 6]]
[1 2 3 4 5 6]
[[[ 1  2  3]
  [ 4  5  6]]

 [[11 12 13]
  [14 15 16]]]
[ 1  2  3  4  5  6 11 12 13 14 15 16]

python numpy二维数组每行循环 numpy 遍历二维数组_二维数组_18

维度转置

transpose函数:将数组的维度进行转置操作。例如:

# 创建一个二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
# 使用transpose函数将其转置
b = np.transpose(a)
print(b)

# 创建一个三维数组
c = np.array([[[1, 2, 3], [4, 5, 6]], [[11, 12, 13], [14, 15, 16]]])
print(c)
# 使用transpose函数将其转置
d = np.transpose(c)
print(d)

输出内容:

[[1 2 3]
 [4 5 6]]
[[1 4]
 [2 5]
 [3 6]]
[[[ 1  2  3]
  [ 4  5  6]]

 [[11 12 13]
  [14 15 16]]]
[[[ 1 11]
  [ 4 14]]

 [[ 2 12]
  [ 5 15]]

 [[ 3 13]
  [ 6 16]]]

python numpy二维数组每行循环 numpy 遍历二维数组_NumPy_19

最大值的索引

argmax函数:返回数组中最大值的索引。例如:

# 创建一个一维数组
a = np.array([1, 3, 2, 4, 5])
print(a)
# 使用argmax函数找到最大值的索引
b = np.argmax(a)
print(b)

# 创建一个二维数组
c = np.array([[1, 3, 2, 4, 5], [6, 7, 10, 9, 8]])
print(c)
# 使用argmax函数找到最大值的索引
d = np.argmax(c)
print(d)

输出内容:

[1 3 2 4 5]
4
[[ 1  3  2  4  5]
 [ 6  7 10  9  8]]
7

python numpy二维数组每行循环 numpy 遍历二维数组_NumPy_20

最小值的索引

argmin函数:返回数组中最小值的索引。例如:

# 创建一个一维数组
a = np.array([11, 3, 2, 4, 5])
print(a)
# 使用argmin函数找到最小值的索引
b = np.argmin(a)
print(b)

# 创建一个二维数组
c = np.array([[11, 3, 12, 4, 5], [6, 7, 10, 9, 8]])
print(c)
# 使用argmin函数找到最小值的索引
d = np.argmin(c)
print(d)

输出内容:

[11  3  2  4  5]
2
[[11  3 12  4  5]
 [ 6  7 10  9  8]]
1

python numpy二维数组每行循环 numpy 遍历二维数组_数据分析_21

总结

NumPy提供了丰富的数组操作、数学函数、线性代数、随机数生成等功能,为科学计算和数据分析提供了强大的支持。以上列出的仅仅是一些常见的操作,还有更多更强大的功能我们下次继续探索。