Numpy概述
NumPy 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 是一个运行速度非常快的数学库,主要用于数组计算,主要功能包括线性代数、傅里叶变换、随机数生成等功能。底层核心是ndarray。
Numpy特点
- 代码更简洁:Numpy直接以数组、矩阵为粒度进行计算,并且支持大量的数学函数;
- 性能更高效:Numpy底层采用C语言实现、释放了GIL锁、算法更先进;
- 是其他数据科学库的基础:Numpy是Pandas、SciPy、Scikit-Learn、Tensorflow等库的基础
Numpy安装
pip install numpy
pip install numpy -i https://pypi.douban.com/simple/
若pip安装不成功可以通过wheel方式安装
# whl文件名称是:numpy-1.21.1-cp38-cp38-win_amd64.whl,若安装不成功,将其名称改为numpy-1.21.1-cp38-none-win_amd64.whl
pip install numpy-1.21.1-cp38-cp38-win_amd64.whl
pip install numpy-1.21.1-cp38-none-win_amd64.whl
获取当前版本
import numpy as np
print(np.__version__)
获取帮助信息
import numpy as np
print(help(np.info(np.random.rand)))
ndarray对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray特点
- ndarray 对象是用于存放同类型元素的多维数组
- ndarray 中的每个元素在内存中都有相同存储大小的区域
ndarray内部结构
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
性能对比
import numpy as np
import time
def sum(n):
param1 = [i ** 2 for i in range(n)]
param2 = [i ** 3 for i in range(n)]
result = []
for i in range(n):
result.append(param1[i] + param2[i])
return result
time_begin = time.time()
sum(1000000)
time_end = time.time()
print(time_end - time_begin) # 622ms
def sum1(n):
param1 = np.arange(n) **2
param2 = np.arange(n) **3
return param1 + param2
time_start = time.time()
sum1(1000000)
time_stop = time.time()
print(time_stop - time_start) # 9ms
Numpy基本操作
创建数组
array函数
import numpy as np
np.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
import numpy as np
arr1 = np.array([1, 2, 3])
print(arr1) # 一维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2) # 二维数组
arr3 = np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]]])
print(arr3) # 三维数组
# 通过指定维数(ndim)创建数组
arr4 = np.array([1, 2, 3, 4, 5], ndmin=2)
print(arr4) # [[1 2 3 4 5]]
python列表创建数组
import numpy as np
num_list = [4, 5, 6, 7]
result = np.array(num_list)
print(result) # [4 5 6 7]
print(type(result)) # <class 'numpy.ndarray'>
print(result.size) # 4
print(result.shape) # (4,)
python元组创建数据
import numpy as np
num_list = (4, 5, 6, 7)
result = np.array(num_list)
print(result) # [4 5 6 7]
print(type(result)) # <class 'numpy.ndarray'>
print(result.size) # 4
print(result.shape) # (4,)
python集合创建数组
import numpy as np
# 采用集合创建numpy数组时,将集合整体作为数组的一个元素
num_list = {
4, 5, 6, 7}
result = np.array(num_list)
print(result) # {4, 5, 6, 7}
print(type(result)) # <class 'numpy.ndarray'>
print(result.size) # 1
print(result.shape) # ()
字典创建数组
import numpy as np
# 采用字典创建numpy数组时,将字典整体作为数组的一个元素
dic_list = {
"name": "Mary",
"age": 18
}
result3 = np.array(dic_list)
print(result3) # {'name': 'Mary', 'age': 18}
print(type(result3)) # <class 'numpy.ndarray'>
print(result3.size) # 1
print(result3.shape) # ()
通过集合和字典创建时属性值与预期不同。通常numpy与list结合使用
数据类型dtype
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
默认类型
import numpy as np
num_list = np.array([3, 5, 6, 8])
print(num_list.dtype) # int32
num_list1 = np.array([4.5, 2.4, 7.5])
print(num_list1.dtype) # float64
num_list2 = np.array([1 + 3j, 3 + 5j])
print(num_list2.dtype) # complex128
Numpy整形、浮点型、复数默认的值为int32、float64、complex128
指定类型创建数组
import numpy as np
arr = np.array([1, 2, 3, 4], dtype=bool)
print(arr) # [ True True True True]
arr1 = np.array([1, 2, 3, 4], dtype=np.float32)
arr1_1 = np.array([1, 2, 3, 4], dtype=float)
print(arr1) # [1. 2. 3. 4.]
print(arr1_1) # [1. 2. 3. 4.]
arr2 = np.array([1, 2, 3, 4], dtype=str)
print(arr2) # ['1' '2' '3' '4']
arr3 = np.array([1, 2, 3, 4], dtype=np.complex64)
print(arr3) # [1.+0.j 2.+0.j 3.+0.j 4.+0.j]
arr4 = np.array([1, 2, 3.5, '4'], dtype=object)
print(arr4) # [1 2 3.5 '4']
通过指定类型创建数组时,np.int32与int等价;np.float64与float等价;np.complex128与complex等价。
Ndarray中的数据必须是同一类型,否则会自动向下转换。int -> float -> str
import numpy as np
arr1 = np.array([1,2,3,4,'5'])
print(arr1) # ['1' '2' '3' '4' '5']
arr2 = np.array([1,2,3,4,5.0])
print(arr2) # [1. 2. 3. 4. 5.]
数组属性
属性 | 描述 |
---|---|
dtype | 数据类型 |
ndim | 维度数量或轴的数量 |
shape | 维度或形状(行,列) |
size | 元素个数 |
itemsize | 元素字节数 |
nbytes | 数组总共字节数 (nbytes = size * itemsize) |
数组属性操作
import numpy as np
# 一维数组
arr1 = np.array([4, 5, 6])
print(type(arr1)) # <class 'numpy.ndarray'>
print(arr1.dtype) # int32
print(arr1.size) # 3
print(arr1.ndim) # 1
print(arr1.shape) # (3,)
print(arr1.itemsize) # 4 (整形占4个字节)
print(arr1.nbytes) # 12
# 二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(type(arr2)) # <class 'numpy.ndarray'>
print(arr2.dtype) # int32
print(arr2.size) # 6
print(arr2.ndim) # 2
print(arr2.shape) # (2, 3)
print(arr2.itemsize) # 4 (整形占4个字节)
print(arr2.nbytes) # 24
shape()函数以元组的形式返回数组的形状,若数组是一维的,返回数组元素个数
改变数组维度
import numpy as np
arr = np.array([3, 5, 8, 5, 3, 7, 6, 3, 7])
print(arr