nmupy 索引/元素类型/数组运算/函数/广播
NUMPY索引和切片
数组和标量之间的运算
a+1 a*3 1//a a**0.5
同样大小数组之间的运算
a+b a/b a**b
数组的索引
a[5] a2[2][3] a2[2,3]
数组的切片
a[5:8] a[:3]=1 a2[1:3,:4] a2[:,:1] a2[:,1]
与列表不同,数组切片不会自动复制,在切片数组上的修改会影响原数组
【解决方法:copy()】
b = a[:4] b = a[:4].copy() b[-1] = 250 b[-1] =250
问题:给一个数组,选出数组中所有大于5的数。
a[a>5]
原理:a>5,会对a中的每一个元素进行判断,返回一个布尔数组
布尔型索引,将同样大小的布尔数组,传递索引,会返回一个由True对应位置的与元素的数组。
给出一个数组,选出数组中所有大于5的偶数
a[a>5 & (a%2==0)]
给出一个数组,选出数组中所有大于5的数和偶数
a[a>5 | (a%2==0)]
花式索引*
对于一个数组,选出其1,3,4,6,7个元素,组成心的二维数组。
a[[1,3,4,6,7]]
indexing
实例子:取子矩阵
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) #取子矩阵 array([[ 6, 7], [10, 11]]) a[-2:,1:3] ### -2:,行,倒数第二行一直到最后 1:3,列,从第一列,到第三列。 #取 数字7 a[1,-2]
二维数据,也有可能产生一维。
当我们在一个纬度,采用整数来获取元素,a.shape,来获取的时候,纬度就会-1
当我们,不采用整数获取元素的时候,纬度可能会+1,或者不变。
arange:产生一个指定范围的数组
a
array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
#a数组,每一行的第二列数字+10
方法一:
a[np.arange(3),1]+=10
方法二:
a[np.arange(3),[1,1,1]]+=10
方法三:
a[[0,1,2],[1,1,1]]+=10
array([[1,12,3,4],
[5,16,7,8],
[9,20,11,12]])
##
np.arange(3)
array([0,1,2]) #产生一个包含数组[0,1,2]
##np.arange(3,7)
arry([3,4,5,6]) #产生一个数组,从3到7,不包含7
result_index = a>10
a[result_index] #获取a>10的元素,保存到一个数组中
#简化操作
a[a>10]
元素的数据类型
import numpy as np a = np.array([1,2]) a.dtype #dtype(int64)
a = np.array([1.1,2.2]) a.dtype() #dtype('float64')
a = np.array([1,2.2])
#dtype('float64')
#a = np.array([1.1,2.6])
a= np.array([1.1,2.6],dtype=np.int64) #指定数据类型
结果:去掉小数部分
array([1,2])
###
a = np.array([1.1,2.6])
b = np.array(a,type=np.int64)
b结果:
array([1,2])
数组运算和常用函数
例子:非矩阵操作的加减乘除运算
a = np.array([[1,2],
[2,3]]) b = np.array([[5,6], [7,8]])
加法运算: a+b np.add(a,b)
结果:a,b相对应的位置加减法 array([[ 6, 8], [ 9, 11]])
减法运算:对应位置的减法
a-b
np.subtrack(a,b)
乘法运算:
a*b
np.multiply(a,b)
除法运算:
a/b
np.divide(a,b)
矩阵运算操作:
a =np.array([[1, 2], [2, 3]]) b = np.array([[1,2,3], [4,5,6]]) 矩阵之间的运算:乘 a的列,与b的行数相等 a.dot(b) np.dot(a,b) 结果: array([[ 9, 12, 15], [14, 19, 24]])
numpy 常用函数
sum函数:求和
a= np.array([[1, 2],
[2, 3]])
np.sum(a)
# sum:对数组a中的元素,做求和操作
np.sum(a,axis=0)
#axis=0对数组中的每一列,求和操作
# array([3,5])
np.sum(a,axis=1)
#axis=1对数组中的每一行,求和操作
# array([3,5])
mean函数:均值
np.mean(a) #对数组a,所有和的平均值
#对数组a 的每一列,均值操作
np.mean(a,axis=0)
#对数据a,的每一行,均值操作
np.mean(a,axis=1)
uniform函数:指定范围内的随机数值
np.random.uniform(3,4)
#指定生成3,4范围内的随机数值(带小数)
tile函数:一个元素重复指定的次数。
a = array([ [1,2], [2,3]]) np.tile(a,(1,2)) #1行2列,基本单位是a,
#行不变,以a为单位,在列上重复 array([[1, 2, 1, 2], [2, 3, 2, 3]])
np.tile(a,(2,1))
#2行1列,a为单位
#列不变,a为单位,在行上重复
array([[1, 2],
[2, 3],
[1, 2],
[2, 3]])
np.tile(a,(2,3))
#a为单位,在行重复2次,在列上重复3次
array([[1, 2, 1, 2, 1, 2],
[2, 3, 2, 3, 2, 3],
[1, 2, 1, 2, 1, 2],
[2, 3, 2, 3, 2, 3]])
argsort函数:用于将数组当中的元素进行排序。
a = np.array([[3,6,4,11], [5,10,1,3]])
a.argsort()
#每一行元素的下标,从小到大排序的
array([0,2,1,3],
[2,3,0,1])
#每一列元素下表,按从小到大排序
array([0,0,1,1],
[1,1,0,0])
矩阵转置操作
a = np.array([[3,6,4,11], [5,10,1,3]])
#2种转置方法 a.T
np.transpose(a) #第一列,转置成第一行,以此类推 array([3,5], [6,10], [4,1], [11,3])
广播:
在缺失纬度,和数组为1的纬度进行
a = np.array([[1,2,3], [2,3,4], [12,31,22], [2,2,2]])
#二维,4*3的数据
b = np.array([1,2,3])
#将a的每一行,和b相加
第一种方式:
for i in range(4):
a[i, :] += b
#结果
array([[ 2, 4, 6],
[ 3, 5, 7],
[13, 33, 25],
[ 3, 4, 5]])
第二种方式:
a + np.tile(b,(4,1))
a+,以b为单位,行重复4次,列重复1。
#
array([[ 3, 6, 9],
[ 4, 7, 10],
[14, 35, 28],
[ 4, 6, 8]])
第三种方式:
a + b
广播会在缺失纬度,和数组为1的纬度进行,这就是广播特性。