如果你在进行大矩阵运算的时候,想必大家最想用的肯定是python的numpy数据格式把。但是以前的我,只会用for循环(反正只要达到目的),但是当你有个几十w行的feature,每个有几千维的时候,那真是要处理无数无数无数无数天啊!!!于是,经导师的一番“刺激”后,小肚决定用:矩阵运算大发提高运算速率。效果显著!能提高180倍。So,我之前是干嘛了?[微博狗的表情]
-----------------踩坑无数,总结了这篇系统的文章,如果喜欢,欢迎大家浏览---------------
1. 最大最小值
np.max(X, axis=0) #每一列的最大值 np.min(X, axis=0) #每一列的最小值 np.max(X, axis=1) #每一行的最大值 np.min(X, axis=1) #每一行的最小值 ######从这里总结出,axis=0是对列的处理,axis=1是对行的处理,缺省时时对所有的元素进行最大最小值求取。对以后的函数也是这样的####2. 改变numpy的行列数目
X.reshape((m,n)) #将X变成m行n列的矩阵。但是X.shape[0]*X.shape[1] = m*n (针对二维数组而言,其他的也要保证重塑后元素的个数不会改变)3. 复制numpy的行或者列
X.repeat(m, axis=0) #将X按列进行复制m行。即如果X是(x1, y1),则复制后变为(x1*m, y1)。即把(x1, y1)复制m遍“放在下面”。 X.repeat(m, axis=1) #将X按行进行复制m列。即如果X是(x1, y1),则复制后变为(x1, y1*m)。即把(x1, y1)复制m遍“放在右边”。 #axis缺省时时将X的每一个元素复制m次,并按照“先行后列”的顺序拉为1维。 e.g. a = np.array([[1,2,3],[4,5,6]]) a.repeat(2) = array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6])4. numpy转置
X.transpose()5. L2 L1norm
np.linalg.norm(X, ord=1, axis=1) #ord=1表示是L1 norm,ord=2表示是L2norm,axis=1表示是对行进行norm,axis=0表示是对列进行norm,缺省时对所有的进行norm。6. 求均值和方差,标准差
np.mean(X, axis=1) #axis=1表示是对行进行求均值,axis=0表示是对列进行求均值,缺省时对所有的元素求均值。 np.std(X, axis=1) #axis=1表示是对行进行标准差求取,axis=0表示是对列进行标准差求取,缺省时对所有的元素求均值。 np.var(X, axis=1) #axis=1表示是对行进行方差求取,axis=0表示是对列进行方差求取,缺省时对所有的元素求均值。7. 求内积
np.dot(X, Y) #其中X=(m,n), Y=(n,z)必须保证X的列数和Y的行数相同8. 判断元素在不在numpy中
if num in X: #num是不是在X中 if num in X[1,0:5]: #num是不是在X的第一列的前5个元素中9. numpy排序 由于我的目的就是将每一行中的元素分别按照从大到小的顺序排序,所以我用第二个函数就好。这里不细讲其他的排序方法,详情请见我参考的博客。
np.argsort(X, axis=1) #对X的每一行中的元素“分别”进行排序,返回的是从小到大的元素的位置信息。axis=0时是对X的每一列中的元素“分别”进行排序,缺省时axis=1 np.argsort(-X, axis=1) #返回的是从大到小的元素的位置信息。10. 两个numpy的操作 10.1 numpy.setdiff1d(ar1, ar2, assume_unique=False) 返回的是排序好的,在ar1里面不在ar2里面的 即 (ar1- ar1交集ar2)
>>> a = np.array([2, 1, 3, 1, 4, 2]) >>> b = np.array([3, 4, 5, 6]) >>> np.setdiff1d(a, b) array([1, 2])10.2 intersect1d, coom1, coom2 = numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False) 返回的是排序好的,同时在ar1里面和ar2里面的 return_indices=True时,coom1为ar1中的index,coom2为ar2中的index(且如果有重复元素,只返回最前面的元素的index,所以一般我用在无重复元素的时候。大家如果知道怎么返回所有的,请告知我) 即 (ar1交集ar2)
>>> np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1], return_indices=True) (array([1, 3]), array([0, 1]), array([1, 0]))10.3 numpy.in1d(ar1, ar2, assume_unique=False, invert=False) test是否ar1中的元素在ar2中,如果在则为True 如果invert=True,则如果在则为False
>>> test = np.array([0, 1, 2, 5, 0]) >>> states = [0, 2] >>> mask = np.in1d(test, states) >>> mask array([ True, False, True, False, True]) >>> test[mask] array([0, 2, 0]) >>> mask = np.in1d(test, states, invert=True) >>> mask array([False, True, False, True, False]) >>> test[mask] array([1, 5])