numpy
1、numpy中创建结构化数据
import numpy as np
dt = np.dtype([("age",np.int8)])
a = np.array([(10,),(20,),(30,)],dtype=dt)
print(a["age"])
2.numpy的数组属性
属性 | 说明 |
---|---|
ndarray.ndim | 秩 |
ndarray.shape | 形状 |
ndarray.size | 元素总个数m*n |
ndarray.dtype | 元素数据类型 |
ndarray.itemsize | 每个元素的大小,字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | 元素的虚部 |
ndarray.data | 实际数组的缓冲区 |
例子
#a是read-only
a= np.array([1,2,3])
a.flags.writeble=False
3.np创建数组
- np.zeros(shape,dtype=None,order="C")
示例
b=np.zeros((2,2))#默认为浮点数
a=np.zeros((2,2),dtype=[("x","i4"),("y","i4")])
#array([[(0, 0), (0, 0)],
[(0, 0), (0, 0)]], dtype=[('x', '<i4'), ('y', '<i4')])
- np.ones(shape,dtype,order="F")
- np.asarray(a,dtype=None,order=None) a可以是任意形式的输入参数,列表元组,列表的元组,元组的元组,元组的列表,多维数组。
- np.frombuffer(buffer,dtype=float,count=-1,offset=0)实现动态数组,以流的形式读入转换成ndarray对象.参数count是读取的数据数量,-1指全部数据;offset指读取的起始位置。
注意:python3默认str是unicode类型,要在str前加b转换成bytestring类型。 - np.fromiter(iterable,dtype,count=-1),从可迭代对象建立ndarray对象。
- np.arange(start,stop,step,dtype)
- np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)创建等差数列。
- np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)创建等比数列,base参数意思是取对数时候log的下标。
4.ndarray数组的切片和索引
- slice(start,stop,step) 相当于直接array[2:7:2]
- np高级索引(整数数组索引,布尔索引,花式索引)
例一:整数索引
x=np.arange(10).reshape(2,5)
x[[0,1,0,1],[0,1,0,1]]#第一维取行,第二维取列
#array([0, 6, 0, 6])
例二::与...
x[0:1,1:3](左闭右开)
#array([[1, 2]])
x[...,-1:],返回和原二维数组的维度一致
#array([[4],
[9]])
例三:布尔索引
x[x>5]#返回一维结果
#array([6, 7, 8, 9])
例四:花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中
x[[1,0]] 互换第一二行
#array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])
传入多个索引数组(np.ix_)
x[np.ix_([1,0],[2,1,3])]#返回2*3维的二维数组
#array([[7, 6, 8],
[2, 1, 3]])
5 np的broadcast机制
广播的规则:
让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
输出数组的形状是输入数组形状的各个维度上的最大值。
如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
简单理解:对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:
数组拥有相同形状。
当前维度的值相等。
当前维度的值有一个是 1。
a=np.array(1,2,3,4,5)
x+a
#array([[ 1, 3, 5, 7, 9],
[ 6, 8, 10, 12, 14]])
相当于
x+np.tile(a,(2,1))
6. np迭代数组
np.nditer进行迭代
x=np.arange(6).reshape(2,3)
list(np.nditer(x))默认的是行序有先
#[array(0), array(1), array(2), array(3), array(4), array(5)]
list(np.nditer(x.T))
#[array(0), array(1), array(2), array(3), array(4), array(5)]
a=x.T.copy(order="C")
list(np.nditer(a))
#[array(0), array(3), array(1), array(4), array(2), array(5)]
从上述例子可以看出,a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = 'C') 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。
显示地使用某种顺序
list(np.nditer(x,order="F"))
#[array(0), array(3), array(1), array(4), array(2), array(5)]
外部循环
nditer类的构造器拥有flags参数,
在下面的实例中,迭代器遍历对应于每列,并组合为一维数组。
list(np.nditer(x,flags=["external_loop"],order="F"))
[array([0, 3]), array([1, 4]), array([2, 5])]
广播迭代机制
7. np的数组操作
大致分为几类:
- 修改数组形状
- 翻转数组
- 修改数组维度
- 链接数组
- 分割数组
- 数组元素的添加与删除
修改数组形状
函数 | 说明 |
---|---|
reshape | 不改变数据,修改形状 |
flat | 数组元素迭代器 |
flatten | 返回 一份数组拷贝 |
ravel | 返回展开数组 |
翻转数组
函数 | 说明 |
---|---|
transpose | 对换数组的维度 |
.T | 转置 |
rollaxis | 向后滚动指定的轴 |
swapaxes | 对换数组的两个轴 |
例子
#将轴2滚动到轴0
np.rollaxis(a,2,0)
#原始坐标[1,1,0],转换成[0,1,1]
np.swapaxes(arr,axis1,axis2)#交换轴1和轴2
修改数组维度
函数 | 说明 |
---|---|
broadcast | 产生模仿广播的对象 |
broadcast_to | 将数组广播到新形状 |
expand_dims | 扩展数组形状 |
squeeze | 从数组中删除一维条目 |
链接数组
函数 | 说明 |
---|---|
concatenate | 连接沿现有轴的数组序列 |
stack | 沿着新的轴加入一系列数组 |
hstack | 水平堆叠列方向 |
vstack | 竖直堆叠,行方向 |
注意
np.stack(arrays,axis),arrays相同形状的数组序列,axis返回数组中的轴。用于沿新轴连接数组序列,会新增一个维度。
分割数组
函数 | 说明 |
---|---|
split | 将一个数组分割为多个子数组 |
hsplit | 将一个数组水平分割为多个子数组(按列) |
vsplit | 将一个数组分割为多个子数组(按行) |
注意
np.split(arr,indices_or_sections,axis)
a=np.arange(9)
b=np.split(a,[4,7])
#[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
数组元素的添加和删除
函数 | 元素及新数组 |
---|---|
resize | 返回指定形状的新数组 |
append | 将值添加到数组末尾 |
insert | 沿指定轴插入到指定下标之前 |
delete | 删除某个轴的子数组,并返回新数组 |
unique | 查找数组内的唯一元素 |
例子:
np.insert(arr,object,values,axis)
- arr被插入数据的数组
- object插入数据的索引位置
- values 要插入的值
- 按照行列进行插入,未指定时在插入之前的数组会被展开。
8. np 的位运算
np的"bitwise_"开头的函数是位运算函数。
函数 | 说明 |
---|---|
bitwise_and | 位与操作 |
bitwise_or | 位或操作 |
invert | 按位取反 |
left_shift | 向左移动二进制表示的位 |
right_shift | 向右移动二进制表示的位 |
9.np的字符串函数
对dtype的numpy.string_或numpy.unicode_的数组执行向量化字符串操作,这些函数在字符数组类numpy.char中定义
函数 | 说明 |
---|---|
np.char.add() | 对两个数组的逐个字符串元素进行连接 |
.multiply() | 返回按元素多重连接后的字符串 |
... | python字符类型的一些方法 |
10. np的数学公式
三角函数,算术运算函数,复数处理函数,
np.sin(),cos(),tan(),arctan(),arcsin(),arccos(),
- 舍入函数
np.around(a,decimals)四舍五入
np.floor()向下取整。
np.ceil()向上取整。
11. np的排序,条件筛选函数
np.sort(a,axis,kind,order)
kind:默认为"quicksort","mergesort"归并排序,“heapsort”堆排序
np.argsort()返回数组值从小到大的索引值。