numpy 添加删除重复去重及形状变换
一、数组的添加删除与去重
下面是几个常见的数组操作:
- append:将值添加到数组末尾
- insert: 沿指定轴将值插入到指定下标之前
- delete: 返回删掉某个轴的子数组的新数组
- unique: 寻找数组内的唯一元素
- tile:对数组进行重复处理
- repeat:对数组进行重复处理
>>> a = np.array([[1,2,3],[4,5,6]])
>>> np.append(a, [7,8,9]) # 附加后,变成了一维的
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a #原来的数组没有改变
array([[1, 2, 3],
[4, 5, 6]])
>>> a.append([10,11,12]) # ndarray没有这个方法
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-165-a36f3ca1308b> in <module>()
----> 1 a.append([10,11,12])
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> np.append(a, [[7,8,9]],axis = 0) # 注意参数格式
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a = np.array([[1,2],[3,4],[5,6]])
>>> np.insert(a,3,[11,12]) # 在3号位置前插入,变成一维了
array([ 1, 2, 3, 11, 12, 4, 5, 6])
>>> a
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.insert(a,1,[11],axis = 0) # 按行插入
array([[ 1, 2],
[11, 11],
[ 3, 4],
[ 5, 6]])
>>> np.insert(a,1,[11],axis = 1) #按列插入
array([[ 1, 11, 2],
[ 3, 11, 4],
[ 5, 11, 6]])
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.delete(a,5)# 删除指定位置的元素后,变成一维了
array([ 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11])
>>> np.delete(a,1,axis = 0)
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
>>> a # 并不会修改原来的数组
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.delete(a,1,axis = 1)
array([[ 0, 2, 3],
[ 4, 6, 7],
[ 8, 10, 11]])
unique是numpy中非常重要的方法:
>>> a = np.array([0,1,4,7,2,1,4,3])
>>> a
array([0, 1, 4, 7, 2, 1, 4, 3])
>>> np.unique(a)
array([0, 1, 2, 3, 4, 7])
>>> b = np.array([[0,1,4,],[7,2,1],[4,3,0]])
>>> b
array([[0, 1, 4],
[7, 2, 1],
[4, 3, 0]])
>>> np.unique(b)
array([0, 1, 2, 3, 4, 7])
>>> np.unique(b,axis=0)
array([[0, 1, 4],
[4, 3, 0],
[7, 2, 1]])
>>> np.unique(b,axis=1)
array([[0, 1, 4],
[7, 2, 1],
[4, 3, 0]])
>>> b = np.array([[0,1,4,],[7,2,1],[4,3,0],[0,1,4,]])
>>> b
array([[0, 1, 4],
[7, 2, 1],
[4, 3, 0],
[0, 1, 4]])
>>> np.unique(b,axis=0)
array([[0, 1, 4],
[4, 3, 0],
[7, 2, 1]])
可以用tile方法和repeat方法来对数组进行重复操作。
>>> arr = np.arange(4).reshape(2, 2)
>>> arr
array([[0, 1],
[2, 3]])
>>> np.tile(arr, [2, ])
array([[0, 1, 0, 1],
[2, 3, 2, 3]])
>>> np.tile(arr, [2, 3, 2])
array([[[0, 1, 0, 1],
[2, 3, 2, 3],
[0, 1, 0, 1],
[2, 3, 2, 3],
[0, 1, 0, 1],
[2, 3, 2, 3]],
[[0, 1, 0, 1],
[2, 3, 2, 3],
[0, 1, 0, 1],
[2, 3, 2, 3],
[0, 1, 0, 1],
[2, 3, 2, 3]]])
>>> np.repeat(arr, 2)
array([0, 0, 1, 1, 2, 2, 3, 3])
>>> np.repeat(arr, [2, 3], axis=0)
array([[0, 1],
[0, 1],
[2, 3],
[2, 3],
[2, 3]])
二、数组的形状变换
之前介绍过,可以通过数组的shape属性,查看它的形状:
>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[ 2., 8., 0., 6.],
[ 4., 5., 1., 1.],
[ 8., 9., 3., 6.]])
>>> a.shape
(3, 4)
上面的例子中,先通过numpy的random函数生成一个随机3行4列数组,再对每个元素乘10,最后用floor函数取整。
有很多数组方法可以变换它的形状,并且不修改原始数组本身:
>>> a.ravel() # 平铺数组成为一维数组
array([ 2., 8., 0., 6., 4., 5., 1., 1., 8., 9., 3., 6.])
>>> a.flatten()
array([2., 8., 0., 6., 4., 5., 1., 1., 8., 9., 3., 6.])
>>> a.reshape(6,2) # 调整形状
array([[ 2., 8.],
[ 0., 6.],
[ 4., 5.],
[ 1., 1.],
[ 8., 9.],
[ 3., 6.]])
>>> a.T # 返回转置数组
array([[ 2., 4., 8.],
[ 8., 5., 9.],
[ 0., 1., 3.],
[ 6., 1., 6.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)
reshape方法不会修改数组本身,resize则正好相反:
>>> a
array([[ 2., 8., 0., 6.],
[ 4., 5., 1., 1.],
[ 8., 9., 3., 6.]])
>>> a.resize((2,6))
>>> a
array([[ 2., 8., 0., 6., 4., 5.],
[ 1., 1., 8., 9., 3., 6.]])
如果reshape方法的一个参数是-1,那么这个参数的实际值会自动计算得出:
>>> a.reshape(3,-1)
array([[ 2., 8., 0., 6.],
[ 4., 5., 1., 1.],
[ 8., 9., 3., 6.]])