numpy教程
借助了较多网络资源,总结一下,共同学习!
Numpy包括:
一个N维数组对象array
成熟的广播函数库
用于整合C和c++的工具包
一些线性代数、傅里叶变换和随机数生成函数。
Numpy提供了高级的数值编程工具,如:矩阵数据类型、矢量处理等。
1.Numpy基本操作
1.1 列表与矩阵的转化
import numpy as np
#多行的矩阵
array=np.array([
[1,3,5],
[4,6,9]
])
#单行矩阵
array1=np.array([1,2,3])
print(array)
print(array1)
1.2 维度
维度使用array.ndim进行调用,指的是行数。
print(array.ndim)
1.3 行数和列数
使用array.shape直接进行输出
print(array.shape)
1.4 元素个数
使用array.size进行输出
print(array.size)
2. Numpy数组创建
2.1 一维数组创建
a=np.array([xxx,xxx],dtype=?)
#dtype可省略
print(a.dtype)
2.2 多维数组创建
b=np.array([
[x,x,x],[y,y,y,],...
]
)
2.3 零数组创建
zeros((行数,列数))
行数列数使用括号包围
c=np.zeros((3,4)
2.4 一数组创建
ones((行数,列数))
可以指定数据类型
d=np.ones((3,4))
2.5 空数组创建
empty((行数,列数))
每个值都接近于0
e=np.empty((3,4))
2.6 连续数组创建
arange(start,end+1,step)
start为初始位置,end+1为结束位置下一位,step为步长
或者
arange(num) 创建从0到num-1的连续数组
f=np.arange(10,21,2)
2.7 reshape操作
reshape((x,y))修改成x行y列的数组
g=f.reshape((3,4))
如果修改后的数组无法包含原数组的内容,则会报错。
2.8 创建连续性数据
linspace(start,end,number)
从start到end分成number个线段型数据,即创建了一个等差数列。
h=np.linspace(1,10,20)
print(h)
#[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
# 3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
# 6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
# 9.52631579 10. ]
使用linspace创建的数据可以使用reshape进行处理。
3. Numpy基本运算
3.1 一维array运算
直接对应项进行运算操作,如+,-,*,**平方等。
numpy包含了许多数学函数工具,如sin等。
可以使用>,<,==等进行比较,对数组中每一项都进行比较操作。
a=np.array([10,20,30,40])
b=np.arange(4)
print(a-b)
print(a*b)
print(a.dot(b)) #对应项相乘后相加
print(b**2) #每一项进行平方操作
print(np.sin(a))
print(a>4)
print(a==b)
3.2 多维array运算
多维的矩阵乘法:使用dot函数
c=a.dot(b)
d=np.dot(a,b)
#以上两种形式都可以进行矩阵乘法运算
np.random
np.random.random创建随机的浮点数,在[0.0,1.0)。
np.min,max
输出数组中的最小最大值
np.sum
对数组中元素进行求和
如果需要对行或列进行查找运算,就在上述代码中加入axis进行赋值。
如np.sum(a,axis=?) axis=0则以列进行查询 axis=1则以行进行查询
3.3 基本计算
最小元素索引
np.argmin
最大元素索引
np.argmax
求整个矩阵的均值
np.mean 或 ?.mean()
求平均值
np.average
求中位数
np.median
累加
np.cumsum
累差
np.diff
nonzero函数:
https://blog.csdn.net/zhihaoma/article/details/51235016
B = np.array([[3,5,9],
[4,8,10]])
C = np.array([[0,5,9],
[4,0,10]])
print(np.nonzero(B))
print(np.nonzero(C))
#out:
#(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
#(array([0, 0, 1, 1], dtype=int64), array([1, 2, 0, 2], dtype=int64))
仿照列表排序
np.sort()
矩阵转置
np.transpose()或 ?.T
三维以上数组的转置
截取
np.clip(Array,min,max)
保留位于min和max之间的元素,并使用max、min分别替换大于和小于边界的值。
4 numpy索引和切片
调用
通过数组名+[?]进行调用
list切片
在调用时加入切片信息,例如A[1,1:3]或B[1:4]
多维转一维
array.flatten()
flat是一个迭代器,本身是一个object属性
切片
5.numpy array合并
5.1数组合并
上下合并
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B)))
左右合并
D = np.hstack((A,B))
print(D)
5.2 数组转置为矩阵
import numpy as np
A = np.array([1,1,1])
print(A)
print(A.shape)
[1 1 1]
(3,)#此时A为一个数组或数列
#变成行矩阵
print(A[np.newaxis,:]) # [1 1 1]变为[[1 1 1]]
print(A[np.newaxis])
[[1 1 1]]
print(A[np.newaxis,:].shape) # (3,)变为(1, 3)
#变成列矩阵
print(A[:,np.newaxis])
[[1]
[1]
[1]]
print(A[:,np.newaxis].shape)
(3, 1)
5.3 多个矩阵合并
矩阵合并使用concatenate函数
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
A = A[:,np.newaxis] # 数组转为列矩阵
B = B[:,np.newaxis] # 数组转为列矩阵
# axis=0纵向合并
C = np.concatenate((A,B,B,A),axis=0)
print(C)
[[1]
[1]
[1]
[2]
[2]
[2]
[2]
[2]
[2]
[1]
[1]
[1]]
# axis=1横向合并
C = np.concatenate((A,B),axis=1)
print(C)
[[1 2]
[1 2]
[1 2]]
a = np.arange(8).reshape(2,4)
b = np.arange(8).reshape(2,4)
# axis=0多个矩阵纵向合并
c = np.concatenate((a,b),axis=0)
[[0 1 2 3]
[4 5 6 7]
[0 1 2 3]
[4 5 6 7]]
# axis=1多个矩阵横向合并
c = np.concatenate((a,b),axis=1)
[[0 1 2 3 0 1 2 3]
[4 5 6 7 4 5 6 7]]
补 :数组拼接与Concatenate函数
-
将数组转化成list,然后使用list的append或extend函数,适用于简单的一维数组
import numpy as np a=np.array([1,2,3]) b=np.array([4,5,6]) a_list=list(a) b_list=list(b) a_list.extend(b_list) a=np.array(a_list)
-
使用numpy.append(arr,values,axis=none)函数,将一个数组和一个数值,或两个数组拼接。
import numpy as np a=np.array([1,2,3]) b=np.array([7,8]) c=np.append(a,b)
-
通过numpy.concatenate((a1,a2),axis=0)函数,完成多个数组的拼接,a1,a2…为数组类型的参数
#一维数组拼接 import numpy as np a=np.array([1,2,3]) b=np.array([11,22,33]) c=np.array([44,55,66]) d=np.concatenate((a,b,c),axis=0) #二维数组拼接 a=np.array([[1,2,3],[1,2,3]]) b=np.array([[11,22,33],[11,22,33]]) d=np.concatenate((a,b),axis=0) >>>[[ 1 2 3][ 1 2 3][11 22 33][11 22 33]] #如果axis=1,则输出[[ 1 2 3 11 22 33][ 1 2 3 11 22 33]]
6. numpy array分割
6.1 reshape方法
6.2 等量分割
利用split函数进行分割
np.split()
parameters:
-
array:待切割的数组
-
indices_or_sections : int or 1-D array
如果参数是个integar N,array将沿axis方向分割成N个等同array,如果不能分割则报错。
如果参数是1-D array of sorted integars,表明按照给出数组中的数值沿axis方向进行分割
For example,
[2, 3]
would, foraxis=0
, result in - ary[:2]
- ary[2:3]
- ary[3:] If an index exceeds the dimension of the array along
axis
,
an empty sub-array is returned correspondingly. -
axis:
分割的方向,默认为0
import numpy as np
A = np.arange(12).reshape((3,4))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
# 等量分割
# 纵向分割同横向合并的axis
print(np.split(A, 2, axis=1))
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
# 横向分割同纵向合并的axis
print(np.split(A,3,axis=0))
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
6.3 不等量分割
np.array_split()
print(np.array_split(A,3,axis=1))
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
6.4 其他分割方式
np.vsplit() 横向分割
np.hsplit() 纵向分割
# 横向分割
print(np.vsplit(A,3)) # 等价于print(np.split(A,3,axis=0))
# 纵向分割
print(np.hsplit(A,2)) # 等价于print(np.split(A,2,axis=1))
7.numpy copy 和 =
使用=复制会带有关联性,使用copy复制不会带有关联性
8.广播机制
数组间的基本运算是一对一,即a,b形状相同,当两者不同时就会触发广播机制。
from numpy import array
a = array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = array([0,1,2])
print(a+b)
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
当两个array尾部维度兼容时即可以使用广播机制。
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
类似于使用np.title将b进行修改。
b = np.tile([0,1,2],(4,1))
print(a+b)
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
9.常用函数
9.1 np.bincount()
基本形式
统计索引出现的次数
从0到x中最大值
x = np.array([1, 2, 3, 3, 0, 1, 4])
np.bincount(x)
array([1, 2, 1, 2, 1], dtype=int64)
添加weight参数
给定weight数组,对于x中的每一个数出现的索引值,去weight中去寻找对应索引值并进行加和。
例如,x —> [1, 2, 3, 3, 0, 1, 4],w —> [0.3,0.5,0.7,0.6,0.1,-0.9,1], 索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w4=0.1
索引 1 出现在x中index=0与index=5位置,那么在w中访问index=0
与index=5
的位置即可,然后将两这个加和,计算得:w[0]+w[5]=-0.6
其余的按照上面的方法即可!
bincount的另外一个参数为minlength,当所给的minlength多于实际从x中得到的索引数量后,后面没有访问到的设置为0即可。
w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])
np.bincount(x,weights=w)
#array([ 0.1, -0.6, 0.5, 1.3, 1. ])
np.bincount(x,weights=w,minlength=7)
#array([ 0.1, -0.6, 0.5, 1.3, 1. , 0. , 0. ])
9.2 np.argmax()
argmax(a, axis=None, out=None)
返回沿轴axis最大值的索引
x = [[1,3,3],
[7,5,2]]
#axis=0 按列
print(np.argmax(x,axis=0))
#[1 1 0]
x = [[1,3,3],
[7,5,2]]
#axis=1 按行
print(np.argmax(x,axis=1))
#[1 0]
x = [[1,3,3],
[7,5,2]]
print(np.argmax(x))
# 3
9.3 求取精度
np.around([xxxx],decimal=?)
decimal为正数时代表小数点后面的位数
np.around([-0.6,1.2798,2.357,9.67,13], decimals=0)#取指定位置的精度
#array([-1., 1., 2., 10., 13.])
np.around([1.2798,2.357,9.67,13], decimals=1)
#array([ 1.3, 2.4, 9.7, 13. ])
np.around([1,2,5,6,56,55], decimals=-1)
#array([ 0, 0, 0, 10, 60, 60])
#超过五时进行进位
np.around([1,2,5,50,56,190], decimals=-2)
#array([ 0, 0, 0, 0, 100, 200])
#超过50时进行进位
其他
取整
np.floor
取上限
np.ceil
查找
利用np.where实现小于0的值用0填充,大于0的数不变
x = np.array([[1, 0],
[2, -2],
[-2, 1]])
print(x)
[[ 1 0]
[ 2 -2]
[-2 1]]
np.where(x>0,x,0)
array([[1, 0],
[2, 0],
[0, 1]])