NumPy
什么是 NumPy ?
NumPy 是 Python 中科学计算的基础包。
-
Python 库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
-
NumPy 包的核心是 ndarray 对象,它封装了 Python 原生的同数据类型的 n 维数组。
-
为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。
NumPy 数组和原生 Python Array (数组)之间有几个重要的区别:
方面 | NumPy 数组 | Python 原生数组 |
---|---|---|
大小 | 固定大小 | 动态增长 |
数据类型 | 相同 | 允许不同 |
效率 | ♥ | |
代码量 | ♥ | |
(基于Python的科学和数学软件包)使用 | 越来越多使用 | 通常都支持 |
为什么 NumPy 这么快?
-
矢量化
-
广播
介绍
基础知识
NumPy 的主要对象是同构多维数组:一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。——轴。
举例:3D空间中的
-
[1, 2, 1]
:一个轴,该轴有三个元素,长度为3 -
[[ 1., 0., 0.],[ 0., 1., 2.]]
:两个轴,第一轴的长度为2,第二轴的长度为3。 -
NumPy 的数组类被调用 ndarray(别名 array),
numpy.array
; -
Python 的数组类被调用 array,
array.array
。
前者更重要的属性:
ndarray.ndim
- 数组的轴(维度)的个数。ndarray.shape
- 数组的维度。ndarray.size
- 数组元素的总数。ndarray.dtype
- 数组元素的类型。ndarray.itemsize
- 数组中每个元素的字节大小。
等于 ndarray.dtype.itemsize 。
ndarray.data
- 该缓冲区包含数组的实际元素
import numpy as np
a = np.arange(15).reshape(3, 5)
a
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
type(a)
numpy.ndarray
a.ndim
2
a.shape
(3, 5)
a.size
15
a.dtype
dtype('int32')
a.itemsize
4
a.data
<memory at 0x0000022E0246B040>
创建
使用 array
函数从常规 Python 列表或元组中创建数组,得到的数组的类型是从 Python 列表中元素的类型推导出来的。
a = np.array([2,3,4])
a
array([2, 3, 4])
a.dtype
dtype('int32')
b = np.array([1.2, 3.5, 5.1])
b
array([1.2, 3.5, 5.1])
b.dtype
dtype('float64')
Tip:常见的错误,就是调用 array
的时候传入多个数字参数,而不是提供单个数字的列表类型作为参数。
# a = np.array(1,2,3,4) # WRONG
a = np.array([1,2,3,4]) # RIGHT
a
array([1, 2, 3, 4])
array
还可以将序列的序列转换成二维数组,将序列的序列的序列转换成三维数组,等等。
b = np.array([(1.5,2,3), (4,5,6)])
b
array([[1.5, 2. , 3. ], [4. , 5. , 6. ]])
c = np.array( [ [1,2], [3,4] ], dtype=complex )
c
array([[1.+0.j, 2.+0.j], [3.+0.j, 4.+0.j]])
通常,数组的元素最初是未知的,但它的大小是已知的。因此,NumPy 提供了几个函数来创建具有初始占位符内容的数组。这就减少了数组增长的必要,因为数组增长的操作花费很大。
- 函数
zeros
创建一个由0组成的数组 - 函数
ones
创建一个由1组成的数组 - 函数
empty
创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype是 float64 类型的。
np.zeros( (3,4) )
array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
np.ones( (2,3,4), dtype=np.int16 )
array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]], dtype=int16)
np.empty( (2,3) )
array([[1.5, 2. , 3. ], [4. , 5. , 6. ]])
np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
np.arange( 0, 2, 0.3 )
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
np.linspace( 0, 2, 9 )
array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
from numpy import pi
x = np.linspace( 0, 2*pi, 100 )
f = np.sin(x)