本文主要记录一些在学习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表示按列。
本文仅是本人在学习过程中的一些记录。