在重塑函数中使用参数-1Numpy允许我们根据给定的新形状重塑矩阵,该新形状应与原始形状兼容。有趣的是,我们可以将值-1分配给新形状中的一个参数。这只是表明它是一个未知维度,我们希望Numpy弄清楚这个未知维度应该是什么:Numpy将通过查看数组的长度和剩余维度来确保它满足上述条件。让我们看一下以下示例:维度为-1的不同整形操作的图表。a=np.array([[1,2,3,4],[5,6,7,8]])a.shape(2,4)假设我们给行参数为1,给列参数为-1,那么Numpy将计算reshape后的列数为8。a.reshape(1,-1)array([[1,2,3,4,5,6,7,8]])假设我们给行参数为-1,列参数为1,则Numpy会计算reshape后的行数为8。下面的代码a.reshape(-1,1)array([[1],[2],[3],[4],[5],[6],[7],[8]])也是同理。a.reshape(-1,4)array([[1,2,3,4],[5,6,7,8]])a.reshape(-1,2)array([[1,2],[3,4],[5,6],[7,8]])a.reshape(2,-1)array([[1,2,3,4],[5,6,7,8]])a.reshape(4,-1)array([[1,2],[3,4],[5,6],[7,8]])这也适用于任何更高维度的张量重塑,但只能为一个维度参数指定值-1。a.reshape(2,2,-1)array([[[1,2],[3,4]],[[5,6],[7,8]]])a.reshape(2,-1,1)array([[[1],[2],[3],[4]],[[5],[6],[7],[8]]])如果我们尝试重塑它形状不兼容或给出了一个以上的未知尺寸参数,则会报错。a.reshape(-1,-1)ValueError:canonlyspecifyanunknowndimensiona.reshape(3,-1)ValueError:cannotreshapearrayofsize8intoshape(3,newaxis)总之,当试图重塑张量时,新的形状必须包含与旧形状相同的大小具有相同数量的元素,这意味着两个形状的尺寸乘积必须相等。当使用-1参数时,-1对应的维度将是原始数组的维度除以新形状中已经给出的维度的乘积,以保持相同的元素数量。Argpartition:查找数组中最大的N个元素。Numpy的argpartion函数高效地找到N个最大值的索引并返回N个值。给出索引后,我们可以根据需要对值进行排序。array=np.array([10,7,4,3,2,2,5,9,0,4,6,0])index=np.argpartition*(array,-5)[-5:]indexarray([6,1,10,7,0],dtype=int64)np.sort(array[index])array([5,6,7,9,10])剪辑:如何将值保持在数组在一定的区间内在很多数据处理和算法中(比如强化学习中的PPO),我们需要让所有的值都在一个上下限区间内。Numpy内置的Clip函数可以解决这个问题。Numpyclip()函数用于裁剪数组中的值。给定一个区间范围,区间范围外的值将被截断到区间的边界。比如指定区间为[-1,1],小于-1的值会变成-1,大于1的会变成1。剪辑例子:限制数组中的最小值为2最大值为6。#Example-1array=np.array([10,7,4,3,2,2,5,9,0,4,6,0])print(np.clip(array,2,6))[664322562462]#Example-2array=np.array([10,-1,4,-3,2,2,5,9,0,4,6,0])print(np.clip(array,2,5))[524222552452]Extract:从数组中提取符合条件的元素我们可以使用Numpy的extract()函数从数组中提取满足条件的特定元素。arr=np.arange(10)arrarray([0,1,2,3,4,5,6,7,8,9])#Definethecondition,herewetakeMOD3ifzerocondition=np.mod(arr,3)==0conditionarray([True,False,False,True,False,False,True,False,False,True])np.extract(condition,arr)array([0,3,6,9])同样的,如果需要的话,我们可以直接条件结合AND和OR,如下:np.extract(((arr>2)&(arr<8)),arr)array([3,4,5,6,7])setdiff1d:howFindelementsthatareonlyinarrayAbutnotarrayB返回一个数组中不在另一个数组中的唯一元素。这相当于两组数组元素的差值。a=np.array([1,2,3,4,5,6,7,8,9])b=np.array([3,4,7,6,7,8,11,12,14])c=np.setdiff1d(a,b)carray([1,2,5,9])总结以上5个Numpy函数社区不常使用,但是非常简洁优雅。在我看来,我们应该在类似情况下尽可能使用这些功能,不仅因为代码量更少,而且因为它们是解决复杂问题的绝佳方法。
