NumPy数组操作基础

NumPyNumPyBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习使用 NumPy 数组的基础知识。NumPy 是 Python 中一个强大的数值计算库。它为在数组上执行数学运算提供了高效的数据结构和函数。

注意:你可以在 06-copies-and-views.ipynb 中编写代码。步骤中省略了一些打印操作,你可以根据需要打印输出。

理解副本和视图

NumPy 数组由两部分组成:数据缓冲区和元数据。数据缓冲区包含实际的数据元素,而元数据包括数据类型和步幅等信息。

在对 NumPy 数组进行操作时,理解副本和视图之间的区别很重要:

  • 视图 允许你通过更改某些元数据来以不同方式访问数组,而无需更改数据缓冲区。对视图所做的任何更改都会反映在原始数组中。

  • 副本 是一个新数组,它复制了数据缓冲区和元数据。对副本所做的更改不会影响原始数组。

创建视图

可以通过更改数组的某些元数据来创建视图。这会创建一种查看数据的新方式,而无需复制数据。要创建视图,可以使用 ndarray 对象的 view() 方法。

import numpy as np

## 创建一个数组
x = np.array([1, 2, 3, 4, 5])

## 创建一个视图
y = x.view()

## 修改视图
y[0] = 10

## 打印原始数组
print(x)  ## 输出: [10, 2, 3, 4, 5]

在上述示例中,视图 y 允许我们修改原始数组 x

创建副本

可以通过复制数组的数据缓冲区和元数据来创建副本。要创建副本,可以使用 ndarray 对象的 copy() 方法。

import numpy as np

## 创建一个数组
x = np.array([1, 2, 3, 4, 5])

## 创建一个副本
y = x.copy()

## 修改副本
y[0] = 10

## 打印原始数组
print(x)  ## 输出: [1, 2, 3, 4, 5]

在上述示例中,副本 y 与原始数组 x 相互独立。

索引操作

NumPy 中的索引操作根据索引类型的不同,可能会创建视图或副本。

  • 基本索引总是创建视图。例如:
import numpy as np

## 创建一个数组
x = np.arange(10)

## 创建一个视图
y = x[1:3]

## 修改视图
y[0] = 10

## 打印原始数组
print(x)  ## 输出: [0, 10, 2, 3, 4, 5, 6, 7, 8, 9]

在上述示例中,视图 y 反映了对原始数组 x 所做的更改。

  • 高级索引总是创建副本。例如:
import numpy as np

## 创建一个数组
x = np.arange(9).reshape(3, 3)

## 创建一个副本
y = x[[1, 2]]

## 修改原始数组
x[[1, 2]] = [[10, 11, 12], [13, 14, 15]]

## 打印副本
print(y)  ## 输出: [[3, 4, 5], [6, 7, 8]]

在上述示例中,修改原始数组 x 后,副本 y 保持不变。

其他操作

在NumPy中还有其他一些操作也可能会创建视图或副本。

  • reshape() 函数在可能的情况下创建视图,否则创建副本。例如:
import numpy as np

## 创建一个数组
x = np.ones((2, 3))

## 转置数组
y = x.T

## 尝试重塑数组
try:
    y.shape = 6
except AttributeError:
    print("Incompatible shape for in-place modification. Use `.reshape()` to make a copy with the desired shape.")

在上述示例中,数组 y 在转置后变得不连续,因此重塑它需要进行复制。

  • ravel() 函数在可能的情况下返回数组的连续扁平视图。另一方面,flatten() 方法总是返回数组的扁平副本。例如:
import numpy as np

## 创建一个数组
x = np.arange(9).reshape(3, 3)

## 创建一个扁平视图
y = x.ravel()

## 创建一个扁平副本
z = x.flatten()

## 打印原始数组
print(x)  ## 输出: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]

在上述示例中,y 是一个视图,而 z 是一个副本。

判断数组是视图还是副本

你可以使用 ndarray 对象的 base 属性来判断一个数组是视图还是副本。对于视图,base 属性返回原始数组;对于副本,base 属性返回 None。例如:

import numpy as np

## 创建一个数组
x = np.arange(9)

## 创建一个视图
y = x.reshape(3, 3)

## 创建一个副本
z = y[[2, 1]]

## 检查 y 是否是视图
print(y.base)  ## 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8]

## 检查 z 是否是副本
print(z.base is None)  ## 输出: True

在上述示例中,y 是视图,z 是副本。

总结

在本实验中,你学习了使用NumPy数组的基础知识。你了解了副本和视图,以及如何创建它们。你还学习了索引操作和其他可能创建视图或副本的操作。最后,你学习了如何使用 base 属性来判断一个数组是视图还是副本。

通过理解这些概念并使用适当的方法,你可以使用NumPy高效地处理和分析数据。