Numpy 中包含了一些函数用于处理数组,大概可分为以下几类:
- 修改数组形状
- 翻转数组
- 修改数组维度
- 连接数组
- 分割数组
- 数组元素的添加与删除
修改数组形状
reshape
不改变数据的条件下修改形状flat
数组元素迭代器flatten
返回一份数组拷贝,对拷贝所做的修改不会影响原始数组ravel
返回展开数组
numpy.reshape
函数
可以在不改变数据的条件下修改形状,格式如下:
numpy.reshape(arr, newshape, order='C')
参数说明:
- arr:要修改形状的数组
- newshape:整数或者整数数组,新的形状应当兼容原有形状
- order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序
示例:
In [1]: import numpy as np
In [2]: sum = np.arange(8)
In [3]: sum
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7])
In [4]: sum.reshape(4,2)
Out[4]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
numpy.ndarray.flat
函数
是一个数组元素迭代器
In [1]: import numpy as np
In [2]: sum = np.arange(9).reshape(3,3)
In [3]: for row in sum:
...: print(row)
...:
[0 1 2]
[3 4 5]
[6 7 8]
In [4]: for element in sum.flat:
...: print(element)
...:
0
1
2
3
4
5
6
7
8
numpy.ndarray.flatten
函数
返回一份数组拷贝,对拷贝所做的修改不会影响原始数组,格式如下:
ndarray.flatten(order='C')
参数说明:
- order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序
示例:
In [1]: import numpy as np
In [2]: sum = np.arange(8).reshape(2,4)
In [3]: sum
Out[3]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
In [4]: sum.flatten()
Out[4]: array([0, 1, 2, 3, 4, 5, 6, 7])
In [5]: sum.flatten(order='F')
Out[5]: array([0, 4, 1, 5, 2, 6, 3, 7])
numpy.ravel
函数
展平的数组元素,顺序通常是"C风格",返回的是数组视图(view,有点类似 C/C++引用reference的意味),修改会影响原始数组
numpy.ravel(num, order='C')
参数说明:
- order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序
示例:
In [1]: import numpy as np
In [2]: num = np.arange(8).reshape(2,4)
In [3]: num
Out[3]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
In [4]: num.ravel()
Out[4]: array([0, 1, 2, 3, 4, 5, 6, 7])
In [5]: num.ravel(order='F')
Out[5]: array([0, 4, 1, 5, 2, 6, 3, 7])
翻转数组
- transpose 对换数组的维度
- ndarray.T 和 self.transpose() 相同
- rollaxis 向后滚动指定的轴
- swapaxes 对换数组的两个轴
numpy.transpose
函数
用于对换数组的维度,格式如下:
numpy.transpose(arr, axes)
- arr:要操作的数组
- axes:整数列表,对应维度,通常所有维度都会对换
示例:
In [1]: import numpy as np
In [2]: num = np.arange(12).reshape(3,4)
In [3]: num
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [4]: np.transpose(num)
Out[4]:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
numpy.ndarray.T
类似 numpy.transpose
In [5]: num.T
Out[5]:
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
numpy.rollaxis
函数
向后滚动特定的轴到一个特定位置,格式如下:
numpy.rollaxis(arr, axis, start)
参数说明:
- arr:数组
- axis:要向后滚动的轴,其它轴的相对位置不会改变
- start:默认为零,表示完整的滚动。会滚动到特定位置
示例:
In [1]: import numpy as np
In [2]: num = np.arange(8).reshape(2,2,2)
In [3]: num
Out[3]:
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
In [4]: np.rollaxis(num, 2)
Out[4]:
array([[[0, 2],
[4, 6]],
[[1, 3],
[5, 7]]])
In [5]: np.rollaxis(num, 2, 1)
Out[5]:
array([[[0, 2],
[1, 3]],
[[4, 6],
[5, 7]]])
numpy.swapaxes
函数
用于交换数组的两个轴,格式如下:
numpy.swapaxes(arr, axis1, axis2)
参数说明:
- arr:输入的数组
- axis1:对应第一个轴的整数
- axis2:对应第二个轴的整数
示例:
In [1]: import numpy as np
In [2]: num = np.arange(8).reshape(2,2,2)
In [3]: num
Out[3]:
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
In [4]: np.swapaxes(num, 2, 0)
Out[4]:
array([[[0, 4],
[2, 6]],
[[1, 5],
[3, 7]]])
修改数组维度
- broadcast 产生模仿广播的对象
- broadcast_to 将数组广播到新形状
- expand_dims 扩展数组的形状
- squeeze 从数组的形状中删除一维条目
numpy.broadcast
函数
用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果,该函数使用两个数组作为输入参数,如下实例:
In [1]: import numpy as np
In [2]: x = np.array([[1], [2], [3]])
In [3]: y = np.array([4, 5, 6])
In [4]: x
Out[4]:
array([[1],
[2],
[3]])
In [5]: y
Out[5]: array([4, 5, 6])
In [6]: num = np.broadcast(x, y)
In [7]: num
Out[7]: <numpy.broadcast at 0x7fac788ebce0>
In [8]: a, b = num.iters
In [9]: a
Out[9]: <numpy.flatiter at 0x7fac779ede00>
In [10]: b
Out[10]: <numpy.flatiter at 0x7fac779c9e00>
In [11]: print(next(a), next(b))
1 4
In [12]: print(next(a), next(b))
1 5
In [13]: num.shape
Out[13]: (3, 3)
In [14]: num = np.broadcast(x, y)
In [15]: ape = np.empty(num.shape)
In [16]: ape
Out[16]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
In [17]: ape.shape
Out[17]: (3, 3)
In [18]: ape.flat = [i + j for i, j in num]
In [19]: ape
Out[19]:
array([[5., 6., 7.],
[6., 7., 8.],
[7., 8., 9.]])
In [20]: x + y
Out[20]:
array([[5, 6, 7],
[6, 7, 8],
[7, 8, 9]])
numpy.broadcast_to
函数
将数组广播到新形状,它在原始数组上返回只读视图,它通常不连续。 如果新形状不符合 NumPy 的广播规则,该函数可能会抛出 ValueError
numpy.broadcast_to(array, shape, subok)
示例:
In [1]: import numpy as np
In [2]: num = np.arange(4).reshape(1,4)
In [3]: num
Out[3]: array([[0, 1, 2, 3]])
In [4]: np.broadcast_to(num, (4,4))
Out[4]:
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
numpy.expand_dims
函数
通过在指定位置插入新的轴来扩展数组形状,函数格式如下:
numpy.expand_dims(arr, axis)
参数说明:
- arr:输入数组
- axis:新轴插入的位置
示例:
In [1]: import numpy as np
In [2]: x = np.array(([1,2],[3,4]))
In [3]: x
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: y = np.expand_dims(x, axis=0)
In [5]: y
Out[5]:
array([[[1, 2],
[3, 4]]])
In [6]: x.shape, y.shape
Out[6]: ((2, 2), (1, 2, 2))
In [7]: y = np.expand_dims(x, axis=1)
In [8]: y
Out[8]:
array([[[1, 2]],
[[3, 4]]])
In [9]: x.ndim,y.ndim
Out[9]: (2, 3)
In [10]: x.shape, y.shape
Out[10]: ((2, 2), (2, 1, 2))
numpy.squeeze
函数
从给定数组的形状中删除一维的条目,函数格式如下:
numpy.squeeze(arr, axis)
参数说明:
- arr:输入数组
- axis:整数或整数元组,用于选择形状中一维条目的子集
示例:
In [1]: import numpy as np
In [2]: x = np.arange(9).reshape(1,3,3)
In [3]: x
Out[3]:
array([[[0, 1, 2],
[3, 4, 5],
[6, 7, 8]]])
In [4]: y = np.squeeze(x)
In [5]: y
Out[5]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [6]: x.shape, y.shape
Out[6]: ((1, 3, 3), (3, 3))
连接数组
- concatenate 连接沿现有轴的数组序列
- stack 沿着新的轴加入一系列数组
- hstack 水平堆叠序列中的数组(列方向)
- vstack 竖直堆叠序列中的数组(行方向)
numpy.concatenate
函数
用于沿指定轴连接相同形状的两个或多个数组,格式如下:
numpy.concatenate((a1, a2, ...), axis)
参数说明:
- a1, a2, …:相同类型的数组
- axis:沿着它连接数组的轴,默认为 0
示例:
In [1]: import numpy as np
In [2]: x = np.array([[1,2],[3,4]])
In [3]: x
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: y = np.array([[5,6],[7,8]])
In [5]: y
Out[5]:
array([[5, 6],
[7, 8]])
In [6]: np.concatenate((x, y))
Out[6]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [7]: np.concatenate((x, y), axis=0)
Out[7]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [8]: np.concatenate((x, y), axis=1)
Out[8]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
numpy.stack
函数
用于沿新轴连接数组序列,格式如下:
numpy.stack(arrays, axis)
参数说明:
- arrays相同形状的数组序列
- axis:返回数组中的轴,输入数组沿着它来堆叠
示例:
In [1]: import numpy as np
In [2]: x = np.array([[1,2],[3,4]])
In [3]: x
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: y = np.array([[5,6],[7,8]])
In [5]: y
Out[5]:
array([[5, 6],
[7, 8]])
In [6]: np.stack((x, y), 0)
Out[6]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [7]: np.stack((x, y), 1)
Out[7]:
array([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
numpy.hstack
函数
numpy.hstack 函数是 numpy.stack 函数的变体,它通过水平堆叠来生成数组
In [1]: import numpy as np
In [2]: x = np.array([[1,2],[3,4]])
In [3]: x
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: y = np.array([[5,6],[7,8]])
In [5]: y
Out[5]:
array([[5, 6],
[7, 8]])
In [6]: np.hstack((x, y))
Out[6]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
numpy.vstack
函数
numpy.vstack 函数是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组
In [1]: import numpy as np
In [2]: x = np.array([[1,2],[3,4]])
In [3]: x
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: y = np.array([[5,6],[7,8]])
In [5]: y
Out[5]:
array([[5, 6],
[7, 8]])
In [6]: np.vstack((x, y))
Out[6]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
分割数组
- split 将一个数组分割为多个子数组
- hsplit 将一个数组水平分割为多个子数组(按列)
- vsplit 将一个数组垂直分割为多个子数组(按行)
numpy.split
函数
沿特定的轴将数组分割为子数组,格式如下:
numpy.split(ary, indices_or_sections, axis)
参数说明:
- ary:被分割的数组
- indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
- axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
示例:
In [1]: import numpy as np
In [2]: num = np.arange(9)
In [3]: num
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
In [4]: np.split(num, 3)
Out[4]: [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
In [5]: np.split(num, [4, 7])
Out[5]: [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
numpy.hsplit
函数
用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组
In [1]: import numpy as np
In [2]: num = np.floor(10 * np.random.random((2, 6)))
In [3]: num
Out[3]:
array([[8., 7., 6., 8., 1., 2.],
[3., 9., 5., 3., 8., 5.]])
In [4]: np.hsplit(num, 3)
Out[4]:
[array([[8., 7.],
[3., 9.]]), array([[6., 8.],
[5., 3.]]), array([[1., 2.],
[8., 5.]])]
numpy.vsplit
函数
沿着垂直轴分割,其分割方式与 hsplit 用法相同
In [1]: import numpy as np
In [2]: num = np.arange(16).reshape(4, 4)
In [3]: num
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [4]: np.vsplit(num, 2)
Out[4]:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
数组元素的添加与删除
- resize 返回指定形状的新数组
- append 将值添加到数组末尾
- insert 沿指定轴将值插入到指定下标之前
- delete 删掉某个轴的子数组,并返回删除后的新数组
- unique 查找数组内的唯一元素
numpy.resize
函数
返回指定大小的新数组,如果新数组大小大于原始大小,则包含原始数组中的元素的副本
numpy.resize(arr, shape)
参数说明:
- arr:要修改大小的数组
- shape:返回数组的新形状
示例:
In [1]: import numpy as np
In [2]: x = np.array([[1,2,3],[4,5,6]])
In [3]: x
Out[3]:
array([[1, 2, 3],
[4, 5, 6]])
In [4]: x.shape
Out[4]: (2, 3)
In [5]: y = np.resize(x, (3,2))
In [6]: y
Out[6]:
array([[1, 2],
[3, 4],
[5, 6]])
In [7]: y.shape
Out[7]: (3, 2)
In [8]: y = np.resize(x, (3,3))
In [9]: y
Out[9]:
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3]])
numpy.append
函数
在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError,append 函数返回的始终是一个一维数组
numpy.append(arr, values, axis=None)
参数说明:
arr:输入数组
- values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
- axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)
示例:
In [1]: import numpy as np
In [2]: num = np.array([[1,2,3],[4,5,6]])
In [3]: num
Out[3]:
array([[1, 2, 3],
[4, 5, 6]])
In [4]: np.append(num, [7,8,9])
Out[4]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [5]: np.append(num, [[7,8,9]], axis=0)
Out[5]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [6]: np.append(num, [[5,5,5], [7,8,9]], axis=1)
Out[6]:
array([[1, 2, 3, 5, 5, 5],
[4, 5, 6, 7, 8, 9]])
numpy.insert
函数
在给定索引之前,沿给定轴在输入数组中插入值,如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开
numpy.insert(arr, obj, values, axis)
参数说明:
- arr:输入数组
- obj:在其之前插入值的索引
- values:要插入的值
- axis:沿着它插入的轴,如果未提供,则输入数组会被展开
示例:
In [1]: import numpy as np
In [2]: num = np.array([[1,2],[3,4],[5,6]])
In [3]: num
Out[3]:
array([[1, 2],
[3, 4],
[5, 6]])
In [4]: np.insert(num, 3, [11,12])
Out[4]: array([ 1, 2, 3, 11, 12, 4, 5, 6])
In [5]: np.insert(num, 1, [11], axis=0)
Out[5]:
array([[ 1, 2],
[11, 11],
[ 3, 4],
[ 5, 6]])
In [6]: np.insert(num, 1, 11, axis=1)
Out[6]:
array([[ 1, 11, 2],
[ 3, 11, 4],
[ 5, 11, 6]])
numpy.delete
函数
返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开
Numpy.delete(arr, obj, axis)
参数说明:
- arr:输入数组
- obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
- axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
示例:
In [1]: import numpy as np
In [2]: num = np.arange(12).reshape(3,4)
In [3]: num
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [4]: np.delete(num, 5)
Out[4]: array([ 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11])
In [5]: np.delete(num, 1, axis=1)
Out[5]:
array([[ 0, 2, 3],
[ 4, 6, 7],
[ 8, 10, 11]])
In [6]: num = np.array([1,2,3,4,5,6,7,8,9,10])
In [7]: num
Out[7]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
In [8]: np.delete(num, np.s_[::2])
Out[8]: array([ 2, 4, 6, 8, 10])
numpy.unique
函数
用于去除数组中的重复元素
numpy.unique(arr, return_index, return_inverse, return_counts)
- arr:输入数组,如果不是一维数组则会展开
- return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
- return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
- return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
示例:
In [1]: import numpy as np
In [2]: num = np.array([5,2,6,2,7,5,6,8,2,9])
In [3]: num
Out[3]: array([5, 2, 6, 2, 7, 5, 6, 8, 2, 9])
In [4]: np.unique(num)
Out[4]: array([2, 5, 6, 7, 8, 9])
In [5]: np.unique(num, return_index=True)
Out[5]: (array([2, 5, 6, 7, 8, 9]), array([1, 0, 2, 4, 7, 9]))
In [6]: x, y = np.unique(num, return_index=True)
In [7]: y
Out[7]: array([1, 0, 2, 4, 7, 9])
In [8]: np.unique(num, return_inverse=True)
Out[8]: (array([2, 5, 6, 7, 8, 9]), array([1, 0, 2, 0, 3, 1, 2, 4, 0, 5]))
In [9]: x, y = np.unique(num, return_inverse=True)
In [10]: x
Out[10]: array([2, 5, 6, 7, 8, 9])
In [11]: y
Out[11]: array([1, 0, 2, 0, 3, 1, 2, 4, 0, 5])
In [12]: x[y]
Out[12]: array([5, 2, 6, 2, 7, 5, 6, 8, 2, 9])
In [13]: x, y = np.unique(num, return_counts=True)
In [14]: x
Out[14]: array([2, 5, 6, 7, 8, 9])
In [15]: y
Out[15]: array([3, 2, 2, 1, 1, 1])