如果你在进行大矩阵运算的时候,想必大家最想用的肯定是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])