NumPy基础知识之“访问数组、数组变形”——《Python数据分析与应用》笔记


NumPy 对数组的操作的介绍这里从

  • 通过索引访问数组
  • 变换数组的形态

两个方面进行


对ndarray数组的操作

  • 通过索引访问数组
    • 对一维数组的访问
    • 对多维数组的访问
  • 改变数组的形态
    • reshape 函数改变数组的形状
    • 将数组展平
    • 对数组进行组合
      • hstack 函数实现横向组合
      • vstack 函数实现纵向组合
      • concatenate 函数实现两种组合
    • 对数组进行分割

通过索引访问数组

对一维数组的访问

一维数组的索引方法跟Python中的 list 的索引方法一致:

# 直接通过下标获取某个元素
arr = np.arange(10)
print(arr[5])

# 用范围作为下标获取数组的一个切片
print(arr[3:5]) # 包括 arr[3] 但不包括 arr[5]!

# 范围中的第三个参数表示步长
print(arr[1:-1:2]) # 2表示各一个元素取一个元素

对多维数组的访问

多维数组每个维度都有一个索引,各个维度的索引之间用逗号隔开

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

# 获取第0行中第3列和第4列的元素
print(arr[0, 3:5])

# 获取第1和2行中第2~4列的元素
print(1:, 2:)

# 获取第2列中的元素
print(:, 2)

此外,还有使用 整数函数布尔值 索引访问多维数组的方法:

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

# 如若想一下获取,arr[0, 1], arr[1, 2], arr[2, 3]这三个元素组成的数组,便可通过下面这种方式
print(arr[
	(0, 1, 2),
	(1, 2, 3)
])

# 获取非连续列的元素也可通过序列完成
# 比如索引第1、2行中第0、2、3列的元素
print(arr[1:, (0, 2, 3)])

# 下面是通过布尔值索引访问多维数组的方式
mask = np.array([1, 0, 1], dtype = np.bool)
print(arr[mask, 2]) # 索引第0行,第2行中第2列的元素

改变数组的形态

reshape 函数改变数组的形状

通过 reshape 函数可以改变数组在每个维度上的大小。如果指定的维度和数组的元素的数量不相符,函数会抛出异常

arr = np.arange(12) # 创建一个一维数组
arr1 = arr.reshape(3, 4) # 将一维数组变成3行4列的二维数组

将数组展平

在 NumPy 中,ravel 函数和 flatten函数都可以将多维数组展平,但是reval只能横向展平,flatten 可以选择展平的方向是纵向还是横向。

reval 函数示例:

arr = np.arange(12).reshape(3, 4) # 创建一个二维数组
print(arr)
print(arr.ravel()) # 将数组横向展平

flatten 函数示例:

arr = np.arange(12).reshape(3, 4) # 创建一个二维数组
print(arr.flatten()) # 默认为横向展平
print(arr.flattem('F')) # 加上参数F之后,改为纵向展平

对数组进行组合

对数组的组合分为横向组合和纵向组合,完成组合的函数有hstack函数、vstack函数以及concatenate函数。

hstack 函数实现横向组合

hstack 函数接收一个由ndarray对象组成的元组作为参数。

arr1 = np.arange(12).reshape(3, 4)
arr2 = arr1 * 3
# 两个数组进行横向组合
print(np.hstack((arr1, arr2)))

值得注意的是如果横向组合时两个数组的“行”不相等,函数会抛出异常。
在这里插入图片描述

vstack 函数实现纵向组合

vstack 函数和 hstack 函数用法一样,只是 vstack 函数实现数组的纵向组合

arr1 = np.arange(12).reshape(3, 4)
arr2 = arr1 * 3
# 实现两个数组的纵向组合
print(np.vstack((arr1, arr2)))

concatenate 函数实现两种组合

concatenate 函数通过参数 axis 来选择进行横向组合还是纵向组合,值为1表示横向组合,值为0表示纵向组合

# 实现横向组合
np.concatenate((arr1, arr2), axis = 1)
# 实现纵向组合
np.concatenate((arr1, arr2), axis = 0)

对数组进行分割

Numpy 提供了 hsplit vsplit dsplit split 函数,实现将数组分割成相同大小的子数组,也可指定原数组中需要分割的位置

hsplit 函数实现数组横向分割

所谓横向分割,数组横向分裂成指定数目的子数组

arr = np.arange(16).reshape(4, 4)
print(np.hsplit(arr, 2)) # 指定分割为2个大小相同的子数组

vsplit 函数实现数组的纵向分割
其语法与 hsplit 函数一样,只是分割方向不同而已

split 函数可以通过axis参数实现对横向和纵向的选择,值为1为横向分割,值为0为纵向分割

arr = np.arange(16).reshape(4, 4)
# 横向分割为2个大小相同的子数组
print(np.split(arr, 2, axis = 1))
# 纵向分割为2个大小相同的子数组
print(np.split(arr, 2, axis = 0))

你可能感兴趣的:(Python数据分析与应用,python,numpy)