数组属性
ndim与shape的区别
ndim 轴的数量,即从外到内的层数(axis=0为最外层)
shape 每层数组的元素,返回一个元组,其长度即为ndim,比如(2,2,3)表示axis=0,有两个元素; axis=1, 有两个元素,最内层axis=3有3个元素,ndim=3
创建数组
1. 一般创建
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
numpy.empty(shape, dtype = float, order = ‘C’)创建
空
数组
numpy.zeros(shape, dtype = float, order = ‘C’) 创建
零
数组
numpy.ones(shape, dtype = None, order = ‘C’) 创建
1
数组
2.
从已有的数组创建数组
numpy.asarray(a, dtype = None, order = None) a为任意形式的输入参数,可以是列表, 列表的元组, 元组等
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0) buffer以流的形式传入参数
numpy.fromiter(iterable, dtype, count=-1) 从可迭代对象创建
3.
从数值范围创建数组
numpy.arange(start, stop, step, dtype) 创建start—stop范围内数组
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)创建一维等差数组,num为生成 元素数量
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)创建等比数列,base对数 log 的底数
numpy的切片和索引
1. slice() 通过索引进行切片
import numpy as np
a = np.arange(10)
s = slice(2,7,## 标题2) # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
[2,4,6]
2. [start:stop:step]
b = a[2:7:2]
冒号 : 的解释:如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(
不包括停止索引
)之间的项
3. 包括省略号 …,来使选择元组的长度与数组的维度相同,行位置使用省略号,返回包含行中元素的数组
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
print (a[...,1:]) # 第2列及剩下的所有元素
#输出结果
[2 4 5]
[3 4 5]
[[2 3]
[4 5]
[5 6]]
高级索引
整数数组索引
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
#输出结果,获取数组(0,0),(1,1),(2,0)位置处元素
[1,4,5]
切片 : 或 … 与索引数组组合
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
c = a[1:3,[1,2]]
#输出结果,1:3切片索引不含尾,[1,2]索引数组包含头和尾
[[5 6]
[8 9]]
布尔索引
通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。x[x > 5]
a[~np.isnan(a)] 过滤a中NaN
a[np.iscomplex(a)] 提出复数
花式索引
花式索引指的是利用整数数组进行索引,跟切片不一样,它总是
将数据复制到新数组中
,如果目标是多维数组,那么就是对应下标的行
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]]) #行的索引
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])#传入多个索引数组(要使用np.ix_)
NumPy 广播(Broadcast)
运算中a.shape ≠ b.shape时,触发广播机制
广播的规则:
让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
输出数组的形状是输入数组形状的各个维度上的最大值。
如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b, (4, 1)) # 重复 b 的各个维度
print(a + bb)
#结果
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
tile() 函数,就是将原矩阵横向、纵向地复制。
tile(mat, (1, 4)) # 列复制为原来的四倍
NumPy 迭代数组
numpy.ndite
Numpy 数组操作
修改数组形状
numpy.reshape(arr, newshape, order=‘C’)
numpy.ndarray.flat 数组元素迭代器
ndarray.flatten(order=‘C’) 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组,,order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序。
a=[[0 1 2 3]
[4 5 6 7]]
a.flatten()=[0 1 2 3 4 5 6 7]
numpy.ravel(a, order=‘C’) 展平的数组元素,修改会影响原始数组。
翻转数组
numpy.transpose(arr, axes) 对换数组的维度,类似numpy.ndarray.T转置
numpy.rollaxis(arr, axis, start) 函数向后滚动特定的轴到一个特定位置
axis:要向后滚动的轴,其它轴的相对位置不会改变
start:默认为零,表示完整的滚动。会滚动到特定位置。
a = np.arange(8).reshape(2,2,2)
b=np.rollaxis(a,2)#将轴 2 滚动到轴 0(宽度到深度)
c=np.rollaxis(a,2,1) # 将轴 0 滚动到轴 1:(宽度到高度)
原数组:
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
b:
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
c:
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
numpy.swapaxes(arr, axis1, axis2)交换数组的两个轴
修改数组维度
numpy.broadcast(arr1,arr2) 用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果。
numpy.broadcast_to(array, shape, subok)
numpy.expand_dims(arr, axis) 过在指定位置插入新的轴来扩展数组形状
numpy.squeeze(arr, axis) 从给定数组的形状中删除一维的条目
连接数组
numpy.concatenate((a1, a2, …), axis) 沿指定轴连接相同形状的两个或多个数组
numpy.stack(arrays, axis) 沿新轴
堆叠
数组序列
分割数组
numpy.split(ary, indices_or_sections, axis) 注意: 如果是一个数组,为沿轴切分的位置(左开右闭]
numpy.hsplit 用于水平分割数组
numpy.vsplit 沿着垂直轴分割
数组元素的添加与删除
numpy.resize(arr, shape)
如果新数组大小大于原始大小,则包含原始数组中的元素的副本
numpy.append(arr, values, axis=None) values需要和arr形状相同,axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!
numpy.insert(arr, obj, values, axis) 未传递 Axis 参数,在插入之前输入数组会被展开
Numpy.delete(arr, obj, axis) 返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开。
numpy.unique(arr, return_index, return_inverse, return_counts) 去除数组中的重复元素
NumPy 位运算
bitwise_and对数组元素执行位与操作
bitwise_or对数组元素执行位或操作
invert按位取反
left_shift向左移动二进制表示的位
right_shift向右移动二进制表示的位
numpy函数操作
字符串函数(numpy.char组类中)
add()对两个数组的逐个字符串元素进行连接
multiply()返回按元素多重连接后的字符串
center()居中字符串
capitalize()将字符串第一个字母转换为大写
title()将字符串的每个单词的第一个字母转换为大写
lower()数组元素转换为小写
upper()数组元素转换为大写
split()指定分隔符对字符串进行分割,并返回数组列表
splitlines()返回元素中的行列表,以换行符分割
strip()移除元素开头或者结尾处的特定字符
join()通过指定分隔符来连接数组中的元素
replace()使用新字符串替换字符串中的所有子字符串
decode()数组元素依次调用str.decode
encode()数组元素依次调用str.encode
数学函数
sin()、cos()、tan()
numpy.around(a,decimals) 数返回指定数字的四舍五入值
numpy.floor() 向下取整
numpy.ceil() 向上取整
算术函数
add(),subtract(),multiply() 和 divide()加减乘除
numpy.reciprocal() 返回参数逐元素的倒数
numpy.power() 幂运算
numpy.mod() 余数
NumPy 统计函数
numpy.amin() 和 numpy.amax()计算数组中的元素沿指定轴的最小大值
numpy.ptp() 最大值 - 最小值
numpy.percentile(a, q, axis) q要计算的百分位数
numpy.median() 中位数
numpy.mean() 算术平均值是沿轴的元素的总和除以元素的数量
numpy.average() 没有指定轴,则数组会被展开
np.std 标准差
np.var 方差
NumPy 排序、条件刷选函数
numpy.sort(a, axis, kind, order)kind: 默认为’quicksort’(快速排序)
numpy.argsort() 返回的是数组值从小到大的索引值。
numpy.lexsort() 对多个序列进行排序,返回索引值,将优先级高的项放在后面
sort_complex(a)对复数按照先实部后虚部的顺序进行排序
partition(a, kth[, axis, kind, order]) 分区排序
argpartition(a, kth[, axis, kind, order] 可以通过关键字 kind 指定算法沿着指定轴对数组进行分区
numpy.argmax() 和 numpy.argmin() 沿给定轴返回最大和最小元素的索引
numpy.nonzero() 函数返回输入数组中非零元素的索引。
numpy.where()
numpy.extract() 据某个条件从数组中抽取元素,返回满条件的元素
字节交换
numpy.ndarray.byteswap() 函数将 ndarray 中每个元素中的字节进行大小端转换。
NumPy 副本和视图
视图一般发生在:
视图修改改变原值
1、numpy 的切片操作返回原数据的视图。
2、调用 ndarray 的 view() 函数产生一个视图。
副本一般发生在:
副本修改原值不变
Python 序列的切片操作,调用deepCopy()函数。
调用 ndarray 的 copy() 函数产生一个副本
NumPy 矩阵库(Matrix)numpy.matlib
numpy.matlib.empty(shape, dtype, order) 返回一个新的矩阵
numpy.matlib.zeros()
numpy.matlib.ones()
numpy.matlib.eye()
numpy.matlib.identity() 单位矩阵
numpy.matlib.rand()
矩阵总是二维的,而 ndarray 是一个 n 维数组。 两个对象都是可互换的
NumPy 线性代数
dot两个数组的点积,即元素对应相乘。
vdot两个向量的点积
inner两个数组的内积
matmul两个数组的矩阵积
linalg.det()数组的行列式
linalg.solve()求解线性矩阵方程
linalg.inv() 计算矩阵的乘法逆矩
NumPy IO
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
numpy.savez() 函数将多个数组保存到以 npz 为扩展名的文件中。
np.loadtxt(FILENAME, dtype=int, delimiter=’ ')
np.savetxt(FILENAME, a, fmt="%d", delimiter=",")