1 安装Numpy与导入
如果您已经拥有Python,则可以使用以下命令安装NumPy:
conda install numpy
或
pip install numpy
如果你还没有Python,你可能需要考虑使用Anaconda。这是最简单的入门方法。获得此发行版的好处是,您无需太担心单独安装NumPy或您将用于数据分析的任何主要软件包,例如pandas,Scikit-Learn等。
访问NumPy及其函数,请将其导入Python代码,如下所示:
import numpy as np
我们将导入的名称缩短,以便使用NumPy提高代码的可读性。这是一个被广泛采用的约定,您应该遵循该约定,以便使用您的代码的任何人都可以轻松理解它。
2 数组
2.1 数组概念
您可能偶尔会听到一个称为“ndarray”的数组,它是“N维数组”的简写。N 维数组只是具有任意多个维度的数组。您可能还会听到 1-D、一维数组、2-D 或二维数组等。NumPy 类用于表示矩阵和向量。向量是具有单个维度的数组(行向量和列向量之间没有区别),而矩阵是指具有两个维度的数组。对于 3-D 或更高维数组,术语张量也常用
数组通常是相同类型和大小的项的固定大小的容器。数组中维度和项的数量由其形状定义。数组的形状是指定每个维度大小的非负整数的元组。
下面用一个二维数组举例:
[[0., 0., 0.], [1., 1., 1.]]
一般用axis(轴)来描述,这个数组第一个轴的长度为2,第二个轴的长度为3.
就像在其他Python容器对象中一样,可以通过索引或切片数组来访问和修改数组的内容。与典型的容器对象不同,不同的数组可以共享相同的数据,因此对一个数组所做的更改可能在另一个数组中可见。
2.2 Python中列表与Numpy数组的区别
NumPy为您提供了大量快速有效的方法来创建数组并操作其中的数字数据。虽然Python列表可以在单个列表中包含不同的数据类型,但NumPy数组中的所有元素都应该是同构的。如果数组不是同构的,则要对数组执行的数学运算将非常低效。
为什么使用NumPy?
NumPy数组比Python列表更快,更紧凑。数组消耗较少的内存,并且易于使用。NumPy使用更少的内存来存储数据,它提供了一种指定数据类型的机制。这允许进一步优化代码。
3 数组创建
3.1 np.array()
创建一个简单的一维数组数组所需要做的就是向它传递一个列表。如果选择这样做,还可以指定列表中的数据类型。
>>> import numpy as np >>> a = np.array([1, 2, 3])
二维数组创建也类似
np.array([list1],[list2],...)
3.2 np.zeros()&np.ones
除了从一系列元素创建数组之外,您还可以轻松创建一个填充有0的数组.
>>> np.zeros(2) array([0., 0.])
或者一个填充有1的数组.
>>> np.ones(2) array([1., 1.])
3.3 np.empty()
该函数创建一个数组,其初始内容是随机的,并且取决于内存的状态。
# 创建一个具有两个元素的数组 >>> np.empty(2) array([3.14, 42. ])
3.4 np.arrange()与np.linspace()
- np.arrange()
>>> np.arange(4) array([0, 1, 2, 3])
生成一个从0开始,具有4个元素(即0,1,2,3)的数组
>>> np.arange(2, 9, 2) array([2, 4, 6, 8])
参数1:指定第一个数字
参数2:指定第二个数字
参数3:步长
- np.linspace()
这个函数指定间隔内的值的个数来创建数组,见下方示例:
>>> np.linspace(0, 10, num=5) array([ 0. , 2.5, 5. , 7.5, 10. ])
4 更多常用操作
4.1 排序np.sort()
您可以使用以下命令按升序快速对数字进行排序:
>>> arr = np.array([2, 1, 5, 3, 7, 4, 6, 8]) >>> np.sort(arr) array([1, 2, 3, 4, 5, 6, 7, 8])
除了返回数组的排序副本的 sort 之外,还可以一些可以使用的高阶操作:
- argsort,它是沿指定轴的间接排序,
- lexsort,这是对多个键的间接稳定排序,
- searchsorted,它将在排序数组中查找元素,以及
- partition这是一种部分排序。
4.2 连接np.concatenate()
>>> a = np.array([[1, 2], [3, 4]]) >>> b = np.array([[5, 6]]) >>> np.concatenate((a, b), axis=0) array([[1, 2], [3, 4], [5, 6]]) >>> np.concatenate((a, b.T), axis=1) array([[1, 2, 5], [3, 4, 6]]) >>> np.concatenate((a, b), axis=None) array([1, 2, 3, 4, 5, 6])
4.3 查看数组的属性
ndarray.ndim将告诉您数组的轴数或尺寸。
ndarray.size将告诉您数组的元素总数。这是数组形状的元素的乘积。
ndarray.shape将显示一个整数元组,指示沿数组的每个维度存储的元素数。例如,如果您有一个包含 2 行和 3 列的二维数组,则数组的形状为 。
例如,如果创建此数组:
>>> 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]]])
要查找数组的维数,运行:
>>> array_example.ndim 3
要查找数组中元素的总数,运行:
>>> array_example.size 24
要找到数组的形状,运行:
>>> array_example.shape (3, 2, 4)
4.4 重塑一个数组
reshape方法将为数组提供新形状,而无需更改数据。请记住,当您使用 reshape 方法时,要生成的数组需要具有与原始数组相同数量的元素。如果从包含 12 个元素的数组开始,则需要确保新数组总共包含 12 个元素。
>>> a = np.arange(6) >>> a array([0, 1, 2, 3, 4, 5]) >>> a.reshape((3, 2)) array([[0, 1], [2, 3], [4, 5]])
4.5 索引与切片
Numpy中的索引与切片和Python列表中的类似。
>>> data = np.array([1, 2, 3]) >>> data[1] 2 >>> data[0:2] array([1, 2]) >>> data[1:] array([2, 3]) >>> data[-2:] array([2, 3])
下图是上方代码操作对应的可视化图,数组的索引是从0开始,选取元素遵循左闭右开。
如果想要获取数组的一部分或特定数组元素,以便在进一步分析或其他操作中使用。为此,您需要对数组进行子集化、切片或索引。
例如,如果从以下数组开始:
>>> a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
您可以轻松打印数组中小于 5 的所有值。
>>> print(a[a < 5]) [1 2 3 4]
例如,还可以选择等于或大于 5 的数字,并使用该条件为数组编制索引。
>>> five_up = (a >= 5) >>> print(a[five_up]) [ 5 6 7 8 9 10 11 12]
您可以选择可被 2 整除的元素:
>>> divisible_by_2 = a[a%2==0] >>> print(divisible_by_2) [ 2 4 6 8 10 12]
或者,您可以使用 and 运算符选择满足两个条件的元素:&,|
>>> c = a[(a > 2) & (a < 11)] >>> print(c) [ 3 4 5 6 7 8 9 10]
您还可以使用逻辑运算符 &|,以便返回指定数组中的值是否满足特定条件的布尔值。这对于包含名称或其他分类值的数组非常有用。
>>> five_up = (a > 5) | (a == 5) >>> print(five_up) [[False False False False] [ True True True True] [ True True True True]]