广播原则 ? ?
如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。 广播会在缺失和(或)长度为1的维度上进行。 ? ?? 例如: shape为(3,4,2)的数组能和(4,3)的数组进行运算吗? 分析:不能,因为按照广播原则,从后面往前面数,(3,4,2)和(4,3)中的2和3不相等,所以不能进行运算。
shape为(3,4,2)的数组能和(4,1)的数组进行运算吗? 分析:能,因为按照广播原则,从后面往前面数,(3,8,2)和(8,1)中的2和1虽然不相等,但是因为有一方的长度为1,所以能参与运算。
import numpy as np
#数组与数的计算,相加,相减,相除类似
a1 = np.random.random((2,2))
print(a1)
# 如果想要在a1数组上所有元素都乘以100,那么可以通过以下来实现
a2 = a1*100
print(a2)
# 也可以使用round让所有的元素只保留2位小数
a3 = a2.round(2)
#数组与数组的计算:
#结构相同的数组之间的计算,直接运算
a1 = np.arange(0,12).reshape((3,4))
a2 = np.random.randint(1,10,size=(3,4))
a3 = a1 + a2 #相减/相除/相乘都可以
print(a1)
print(a2)
print(a3)
#与行数相同并且只有1列的数组之间的运算
a1 = np.random.randint(10,20,size=(3,4)) #3行8列
a2 = np.random.randint(1,10,size=(3,1)) #3行1列
a3 = a1 - a2 #行数相同,且a2只有1列,能互相运算,每一列对a2进行运算,即a1的每一列减去a2
print(a1)
print(a2)
print(a3)
#与列数相同并且只有1行的数组之间的运算:
a1 = np.random.randint(10,20,size=(3,4)) #3行4列
a2 = np.random.randint(1,10,size=(1,4))
a3 = a1+ a2 #每一行对a2进行运算,即a1的每一行加上a2
print(a1)
print(a2)
print(a3)
flatten和ravel方法:
? ? 两个方法都是将多维数组转换为一维数组,但是有以下不同:
? ? flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组。 ? ? ravel是将数组转换为一维数组后,将这个视图(可以理解为引用)返回回去,所以后续对这个返回的值进行修改会影响之前的数组。
x = np.array([[1, 2],[2, 4]])
x.flatten()[1]=10 #未改变x
print(x)
x.ravel()[1]=100 #改变x
print(x)
数组的组合
? ? vstack:将数组按垂直方向进行叠加。数组的列数必须相同才能叠加。 ? ? hstack:将数组按水平方向进行叠加。数组的行必须相同才能叠加。 ? ? concatenate([],axis):将两个数组进行叠加,但是具体是按水平方向还是按垂直方向,则要看axis的参数。 ? ? 如果axis=0,那么代表的是往垂直方向(行)叠加,如果axis=1,那么代表的是往水平方向(列)上叠加, ? ? 如果axis=None,那么会将两个数组组合成一个一维数组。 ? ? 需要注意的是,如果往水平方向上叠加,那么行必须相同,如果是往垂直方向叠加,那么列必须相同。
#vstack
a1=np.random.randint(1,10,size=(3,5))
a2=np.random.randint(11,20,size=(1,5))
a3=np.vstack([a1,a2])
a3
#hstack
a1=np.random.randint(1,10,size=(3,2))
a2=np.random.randint(11,20,size=(3,1))
a3=np.hstack([a1,a2])
print(a1)
print(a2)
print(a3)
#concatenate([],axis),axis=0,往垂直方向叠加
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
#concatenate([],axis),axis=1往水平方向叠加
a = np.array([[1, 2, 3],[3, 4, 5]])
b = np.array([[5, 6],[7, 8]])
np.concatenate((a,b), axis=1)
数组的切割
? ? hsplit:按照水平方向进行切割。用于指定分割成几列,可以使用数字来代表分成几部分,也可以使用数组来代表分割的地方。 ? ? vsplit:按照垂直方向进行切割。用于指定分割成几行,可以使用数字来代表分成几部分,也可以使用数组来代表分割的地方。 ? ? split/array_split(array,indicate_or_seciont,axis):用于指定切割方式, ? ? 在切割的时候需要指定是按照行还是按照列,axis=1代表按照列,axis=0代表按照行。
a1 = np.arange(16).reshape(4, 4)
np.vsplit(a1,2) #水平分割成两部分
np.vsplit(a1,[1,3]) #指定位置切割
np.hsplit(a1,2)
np.hsplit(a1,[1,3])
np.split(a1,[1,3],axis=0)
np.split(a1,[1,3],axis=1)
数组(矩阵)转置和轴对换:
#转置
a1.T
#transpose,这个方法返回的是一个View,也即修改返回值,会影响到原来数组
a2=a1.T
a3=a2.transpose()
print(a2)
print(a3)
#算内积需要转置
print(a1.dot(a2))
|