Python Numpy的一些操作可以极大的加快你的code运行速度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值