菜鸟教程
numpy是python的一个库,提供了处理向量、数组、矩阵的函数工具。
对象
Numpy中对象为ndarray,为N维数组对象,是一系列同类型数据的集合。
构成
- 一个指向数据的指针
- 数据类型dtype
- 表示数组形状的元组shape
- 跨度元组stride 其中的整数指的是前进到当前维度下一元素需跨过的字节。
创建
numpy.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
# 创建1维数组
a = np.array([1, 2, 3])
print(a) # [1 2 3]
# 创建2维数组
b = np.array([[1, 2], [3, 4]])
print(b) # [[1 2]
# [3 4]]
# 最小维度
c= np.array([1, 2, 3], ndmin=2)
print(c) # [[1 2 3]] 和先前不同的是存在一个空维度
# dtype
d = np.array([1, 2, 3], dtype=complex)
print(d) # [1.+0.j 2.+0.j 3.+0.j] # 转换类型为复数
数据类型
bool_
int_ # 默认类型
intc # 与C类型相同
intp # 与平台无关的指针大小的整数类型
int8、int16、int32、int64
uint8、uint16、uint32、uint64 # 无符号整数类型
float_ # float64
float16、float32、float64
complex_ # complex128 复数
complex64、complex128
数据类型对象 dtype
import numpy as np
dt=np.dtype(object, align=False, copy=False) # 创建数据类型对象
print(dt) # object
dt1=np.dtype('i4') # 整型4字节
dt2=np.dtype('<i4') # 小端字节序
创建结构化数据类型
dt=np.dtype([('name', 'S10'), ('age', 'i4')])
print(dt) # [('name', 'S10'), ('age', '<i4')]
内建类型的字符代码:
- S,a:字符串
- b:布尔值
- i:整数
- u:无符号整数
- f:浮点数
- c:复数
- m:timedelta
- M:datetime
- O:Python对象
- V:原始数据(void)
数组属性
数组的维数就是矩阵的秩(rank)。
ndarray.shape # 数组形状
ndarray.ndim # 数组维数
ndarray.size # 数组元素个数
ndarray.dtype # 数组元素类型
ndarray.itemsize # 数组元素字节大小
ndarray.data # 数组数据指针(存储实际元素的缓冲,通过索引访问元素)
ndarray.flags # 数组信息(内存布局、是否连续、是否只读)
ndarray.real # 数组的实部
ndarray.imag # 数组的虚部
进阶创建数组
numpy.empty(shape, dtype=float, order='C') # 指定形状,数据类型
numpy.zeros(shape, dtype=float, order='C') # 全零数组
numpy.zeros_like(a, dtype=None, order='K', subok=True) # 与a形状相同的全零数组
numpy.ones(shape, dtype=float, order='C') # 全一数组
numpy.ones_like(a, dtype=None, order='K', subok=True) # 与a形状相同的全一数组
numpy.full(shape, fill_value, dtype=None, order='C') # 全指定值数组
numpy.eye(N, M=None, k=0, dtype=float) # 单位阵
从范围创建数组
numpy.arange(start, stop, step, dtype=None) # 等差数组
numpy.linspace(start, stop, num, endpoint=True, retstep=False, dtype=None) # 等间距数组
numpy.logspace(start, stop, num, endpoint=True, base=10.0, dtype=None) # 对数等间距数组
数组转化
将列表元组等转换为ndarray
numpy.asarray(a, dtype=None, order=None) # 转换为ndarray
与np.array区别在于:
- asarray()不会复制数组,而是直接使用原数据的内存,如果输入数组是ndarray,则会返回原数组。
- array()会复制数组,即使输入数组是ndarray。
数组操作
切片和索引
切片和索引方式本身可以作为一个对象,需要时引用。
s =slice(2, 5, 2) # 切片对象 (start,stop,step)
a=np.arange(10) # 1维数组0-9
print(a[s]) # [2 4]
b=a[2:5:2] # 等效操作
广播
BoardCast发生在两个数组的形状不相同的计算中。
a=np.array([1, 2, 3])
b=np.array([4, 5, 6],[7, 8, 9])
c=a+b
print(c) # [[5 7 9]
# [8,10,12]]
迭代
迭代器对象numpy.nditer()提供了一种灵活访问一个或者多个数组元素的方式。
import numpy as np
a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a):
print (x, end=", " )
print ('\n')
nditer包含一个参数op_flags,用于指定迭代的类型。
- op_flag=readwrite:默认值,表示可以读写元素。
- op_flag=readonly:只读元素。
- op_flag=writeonly:只写元素。
迭代也可以应用在广播上,先广播后迭代
修改数组
改变形状
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组 C横向 F纵向
对换
transpose 对换数组的维度
ndarray.T 和 self.transpose() 相同
rollaxis 向后滚动指定的轴
swapaxes 对换数组的两个轴
修改维度
broadcast 产生模仿广播的对象
broadcast_to 将数组广播到新形状
expand_dims 扩展数组的形状
squeeze 从数组的形状中删除一维条目
改变元素
resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素
此方悬停