numpy

本文主要记录一些在学习numpy过程中较难理解的知识点

1. 高维数组的转置和轴对换
arr = np.arange(16).reshape((2,2,4))

arr
Out[4]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

arr.transpose((1,0,2))
Out[5]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

看上边这个例子,arr是三维数组,我们对数组的维进行编号为(0,1,2)对应于(2,2,4)。
方法arr.transpose((1,0,2))即使按照(1,0,2)重新对数组进行编排,由于arr的特殊性,重新
编排后仍然对应于(2,2,4),但我们看到转置后数组元素位置还是发生了变化,那我我们接下
来就看下对于数组中的每个元素是如何变化的?
     比如元素8,在原数组中的位置为(1,10,0),那么按照(1,0,2)变化后的位置为(0,1,0)
再看一个例子:
arr.T
Out[6]: 
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

arr.transpose((2,1,0))
Out[7]: 
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

其实T就是transpose((n-1,...,0))
下面再来看看swapaxes()方法,其实理解了transpose,这个方法也就简单了,不多说,看例子
arr
Out[12]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

arr.swapaxes(1,2)
Out[13]: 
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

arr.transpose((0,2,1))
Out[14]: 
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

arr.swapaxes(0,2)
Out[15]: 
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

arr.transpose((2,1,0))
Out[16]: 
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])
其实swapaxes就是对给定的两个轴进行对换,底层调用transpose方法实现。

2. 将条件逻辑表述为数组运算:where(cond, x, y)函数,其实就是三元表达式的
     x if condition else y的矢量化版本,示例如下:
arr = np.random.randn(4,4)

arr
Out[18]: 
array([[ 0.3116614 , -0.29381198,  1.11334811, -0.28673322],
       [ 0.06888306,  1.95029464, -0.36339947, -0.99763027],
       [ 0.29912541, -0.27191436, -0.26710484,  0.56917838],
       [-0.13212902, -1.87943977,  0.68109399,  0.12911028]])

np.where(arr>0,1,-1)
Out[19]: 
array([[ 1, -1,  1, -1],
       [ 1,  1, -1, -1],
       [ 1, -1, -1,  1],
       [-1, -1,  1,  1]])
3. 多维数组在一个轴向上进行排序,先看示例:
arr = np.random.randn(5,3)

arr
Out[23]: 
array([[ 0.89674776, -0.61758597, -0.1000459 ],
       [-0.20545343, -0.62419631, -2.45914985],
       [ 0.01016345, -0.80703021, -0.03375413],
       [ 0.16939186,  0.32124179, -0.16929505],
       [ 0.30352826,  0.37034839,  1.18504457]])

arr.sort(1)

arr
Out[25]: 
array([[-0.61758597, -0.1000459 ,  0.89674776],
       [-2.45914985, -0.62419631, -0.20545343],
       [-0.80703021, -0.03375413,  0.01016345],
       [-0.16929505,  0.16939186,  0.32124179],
       [ 0.30352826,  0.37034839,  1.18504457]])
首先,可见这种排序是一种原地排序。 ndarray.sort(axis=-1,kind='quicksort',order=None)

其中axis表示轴向,对于二维,0表示按行,1表示按列。

本文仅是本人在学习过程中的一些记录。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值