NumPy简介
什么是NumPy
NumPy 是一个用于处理数组的 Python 库。
它还包含用于线性代数、傅里叶变换和矩阵领域的函数。
NumPy 由 Travis Oliphant 于 2005 年创建。这是一个开源项目,您可以免费使用。
NumPy 是 Numerical Python 的缩写。
为什么使用NumPy
在 Python 中,我们有类似于数组的列表,但它们的处理速度很慢。
NumPy 的目标是提供一个数组对象,其速度比传统的 Python 列表快 50 倍。
NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使 ndarray 的使用变得非常简单。
数组在数据科学中经常使用,其中速度和资源非常重要。
数据科学:是计算机科学的一个分支,研究如何存储、使用和分析数据以从中获取信息。
为什么 NumPy 比列表更快?
NumPy 数组存储在内存中的一个连续位置,与列表不同,因此进程可以非常高效地访问和操作它们。
在计算机科学中,这种行为称为引用的局部性。
这是 NumPy 比列表更快的主要原因。此外,它还针对最新的 CPU 架构进行了优化。
NumPy 是用哪种语言编写的?
NumPy 是一个 Python 库,部分是用 Python 编写的,但大部分需要快速计算的部分是用 C 或 C++ 编写的。
Numpy入门
NumPy安装
pip install numpy
或者用conda等其他包管理工具
导入
使用import关键字导入即可, 但一般会使用别名np
import numpy as np
# 检查是否导入成功
print(np.__version__)
创建数组
数组对象被称为ndarray, 可以使用array()函数来创建ndarray对象
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
print(type(arr))
type(): 这个内置的 python 函数告诉我们传递给它的对象的类型。就像上面的代码显示 arr 是 numpy.ndarray 类型。
要创建 ndarray,我们可以将列表、元组或任何类似数组的对象传递给 array() 方法,它将被转换为 ndarray:
import numpy as np
arr = np.array((1,2,3,4,5))
print(arr)
数组维度
上面例子都是1维数组, 理论上可以创建无限维度数组, 在np中, 可以使用ndim属性来查看数组维度:
import numpy as np
a = np.array(42)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(a.ndim) # 0
print(b.ndim) # 1
print(c.ndim) # 2
print(d.ndim) # 3
创建数组时,您可以使用 ndmin 参数定义维度数。
import numpy as np
arr = np.array([1, 2, 3, 4], ndmin=5)
print(arr)
print('number of dimensions :', arr.ndim)
数组访问
1维数组访问与原生数组访问无异:
arr[0]
高维数组访问方式, 比如3维数组:
import numpy as np
arr = np.array([
[[1, 2, 3],[4, 5, 6], [7, 8, 9]],
[[4, 5, 6],[7, 8, 9], [1, 2, 3]],
[[7, 8, 9],[1, 2, 3], [4, 5, 6]]
])
print(arr[1, 1, 2])#9
负索引
使用负索引从数组末尾访问数组。
实例
打印第二个维度的最后一个元素:
import numpy as np
arr = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print('Last element from 2nd dim: ', arr[1, -1])
数组切片
在python中, 切片意味着从一个给定的索引到另一个给定的索引中取出元素.
我们像这样传递切片: arr[start:end]
还可以定义步长: arr[start:end:step]
各个参数缺省值
start: 0
end: len(arr)
step: 1
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9])
print(f"取出索引范围维[1:5]的元素: {arr[1:5]}")
print(f"取出索引从4之后的所有元素: {arr[4:]}")
print(f"对从开头到索引4(不包括)的元素进行切片:{arr[:4]}")
print(f"负切片, 取出[-3:-1]的元素:{arr[-3:-1]}")
print(f"从索引 1 到索引 5 返回每隔一个元素:{arr[1:5:2]}")
output:
取出索引范围维[1:5]的元素: [2 3 4 5]
取出索引从4之后的所有元素: [5 6 7 8 9]
对从开头到索引4(不包括)的元素进行切片:[1 2 3 4]
负切片, 取出[-3:-1]的元素:[7 8]
从索引 1 到索引 5 返回每隔一个元素:[2 4]
多维数组切片
import numpy as np
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
print(f"从第二个元素开始,切片索引 1 到索引 4(不包括)的元素:{arr[1, 1:4]}")
print(f"从两个元素中,返回索引 2:{arr[0:2, 2]}")
print(f"从两个元素中,切片索引 1 到索引 4(不包括),这将返回一个二维数组:{arr[0:2, 1:4]}")
output:
从第二个元素开始,切片索引 1 到索引 4(不包括)的元素:[7 8 9]
从两个元素中,返回索引 2:[3 8]
从两个元素中,切片索引 1 到索引 4(不包括),这将返回一个二维数组:[[2 3 4]
[7 8 9]]
数据类型
Python中的数据类型
默认情况下, python具有以下数据类型
strings: 用于标识文本数据, 文本在引号下给出, 比如"abc"integer: 用于表示整数, 例如1, 2, 3float: 用于标识浮点数, 比如0.1boolean: 表示真假, True或Falsecomplex: 用于表示复数, 例如1.0+2.0j
NumPy中的数据类型
NumPy具有一些额外的数据类型, 并使用一个字符来引用数据类型, 如i表示整数, u表示无符号整数等
以下是NumPy中所有数据类型的列表及表示它们的字符
i: 整数b: 布尔值u: 无符号整数f: 浮点数c: 复数浮点数m: 时间差M: 日期时间O: 对象S: 字符串U: Unicode字符串V: 用于其他类型(void)的固定内存块
检查数组的数据类型
NumPy数组对象有一个名为dtype的属性, 可返回数组的数据类型:
arr = np.array(['apple', 'banana', 'cherry'])
print(arr.dtype)
创建指定数据类型的数组
arr = np.array([1, 2, 3, 4], dtype='S')
print(arr.dtype)
对于 i、u、f、S 和 U,我们也可以定义大小。
arr = np.array([1, 2, 3, 4], dtype='i4')
转换现有数组的数据类型
更改现有数组的数据类型的最佳方法是使用astype()方法创建数组的副本
astype()函数创建数组的副本, 并允许您指定数据类型作为参数.
astype()函数创建数组的副本, 并允许您指定数据类型作为参数
数据类型可以使用字符串来指定, 如’f’表示浮点数, 'i’表示整数等, 或者您可以直接使用数据类型, 如float表示浮点数, int表示整数
import numpy as np
arr = np.array([1.1, 2.1, 3.1])
newarr = arr.astype('i')
print(newarr)
print(newarr.dtype)
newarr = arr.astype(int)
print(newarr)
print(newarr.dtype)
arr = np.array([1, 0, 3])
newarr = arr.astype(bool)
print(newarr)
print(newarr.dtype)
在线运行本小节所有示例: numpy数据类型
复制与视图
副本与视图之间的区别
数组的副本和视图之间的主要区别在于,副本是一个新数组,而视图只是原始数组的视图。
副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。
视图不拥有数据,对视图所做的任何更改都会影响原始数组,对原始数组所做的任何更改都会影响视图。
制作副本,更改原始数组,然后显示两个数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 42
print(arr)
print(x)
创建视图,更改原始数组并显示两个数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 42
print(arr)
print(x)
检查数组是否拥有其数据
如上所述,副本拥有数据,而视图不拥有数据,但是我们如何检查这一点呢?
每个 NumPy 数组都有一个属性 base,如果数组拥有数据,则返回 None。
否则,base 属性将引用原始对象。
打印 base 属性的值以检查数组是否拥有其数据:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
y = arr.view()
print(x.base) # None
print(y.base) # [1 2 3 4 5]
在线运行: http://jupyter.yan.cpolar.top/lab/workspaces/auto-7/tree/numpy/05. 复制与视图.ipynb
数组形状
数组的形状是每个维度中的元素数量
获取数组形状
数组有一个名为shape的属性, 它返回一个元组, 每个索引都有相应元素的数量
打印二维数组的形状:
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)
上面的示例返回 (2, 4),这意味着该数组有 2 个维度,其中第一个维度有 2 个元素,第二个维度有 4 个元素。
在线运行: http://jupyter.yan.cpolar.top/lab/workspaces/auto-7/tree/numpy/06. 数组形状.ipynb
NumPy 数组重塑
重塑意味着改变数组的形状。
数组的形状是每个维度中元素的数量。
通过重塑,我们可以添加或删除维度,或更改每个维度中的元素数量。
将以下包含 12 个元素的一维数组转换为 3 维数组。
最外面的维度将有 2 个数组,其中包含 3 个数组,每个数组有 2 个元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(2, 3, 2)
print(newarr)
我们可以重塑成任何形状吗?
是的,只要两个形状中重塑所需的元素相同即可。
我们可以将 8 个元素的 1D 数组重塑为 4 个元素的 2 行 2D 数组,但我们无法将其重塑为 3 个元素的 3 行 2D 数组,因为这需要 3x3 = 9 个元素。
尝试将具有 8 个元素的 1D 数组转换为每个维度具有 3 个元素的 2D 数组(会引发错误)
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
newarr = arr.reshape(3, 3)
print(newarr)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[3], line 5
1 import numpy as np
3 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
----> 5 newarr = arr.reshape(3, 3)
7 print(newarr)
ValueError: cannot reshape array of size 8 into shape (3,3)
返回副本还是视图
检查返回的数组是副本还是视图:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(arr.reshape(2, 4).base)
上面的示例返回原始数组,因此它是一个视图。
未知维度
你可以有一个“未知”的维度。
这意味着您不必在重塑方法中为其中一个维度指定准确的数字。
将 -1 作为值传递,NumPy 将为您计算此数字。
将具有 8 个元素的 1D 数组转换为具有 2x2 元素的 3D 数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
newarr = arr.reshape(2, 2, -1)
print(newarr)
注意:我们不能将 -1 传递给多个维度。
展平数组
展平数组意味着将多维数组转换为 1D 数组。
我们可以使用 reshape(-1) 来做到这一点。
实例
将数组转换为一维数组:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)
注意: NumPy 中有很多用于更改数组形状的函数,如 flatten、ravel,以及用于重新排列元素的 rot90、flip、fliplr、flipud 等。这些属于 numpy 的中级到高级部分。
在线运行: http://jupyter.yan.cpolar.top/lab/tree/numpy/07. 数组重塑.ipynb
评论