数组创建
数组创建有多种方法,如
- 使用
array
函数从常规的python列表或元组中创建数组,其数据类型从python列表中的元素的类型推导生成; - 使用
arange
, linespace
等函数创建数字序列; - 使用
zeros
, ones
,empty
等函数创建多维数组,数据类型默认为float64
; - 通过使用字符串或缓冲区从原始字节创建数组;
基本创建函数
属性 | 功能 |
---|
numpy.array(object, dtype=None, copy=True, order=‘K’, subok=False, ndmin=0) | 从实现__array__接口的对象或者序列创建一个数组对象 |
numpy.asarray(a, dtype=None, order=None) | 等价于array(a,copy=False),即当输入是数组对象,返回输入数组的引用 |
numpy.arange([start, ]stop, [step, ]dtype=None) | 返回一个值等间隔的序列,由于浮点数精度限制,不保证序列长度 |
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) | 返回指定间隔内长度固定且间隔均匀的数字序列 |
numpy.ones(shape, dtype=None, order=‘C’) | 返回一个给定形状和类型的新数组,用1填充 |
numpy.zeros(shape, dtype=float, order=‘C’) | 返回一个给定形状和类型的新数组,用0填充 |
numpy.empty(shape, dtype=float, order=‘C’) | 返回一个给定形状和类型的新数组,不初始化值 |
numpy.ones_like(a, dtype=None, order=‘K’, subok=True) | 返回一个与给定数组具有相同形状和类型的数组,用1填充 |
numpy.full_like(a, fill_value, dtype=None, order=‘K’, subok=True) | 返回与给定数组具有相同形状和类型的完整数组,用给定值填充 |
""""从python内置数据类型创建array"""
>>> a = np.array([2,3,4])
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')
>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
"""创建规则数字序列"""
>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
>>> np.zeros((2,3))
array([[0., 0., 0.],
[0., 0., 0.]])
>>> np.linspace( 0, 2, 9 )
array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
"""创建固定大小的填充数组"""
>>> np.ones((2,3), dtype=np.int16)
array([[1, 1, 1],
[1, 1, 1]], dtype=int16)
>>> np.empty((2,3))
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
>>> a = np.array([[1,2,3], [4,5,6]])
>>> np.zeros_like(a)
array([[0, 0, 0],
[0, 0, 0]])
>>> np.full_like(a, 1.1)
array([[1, 1, 1],
[1, 1, 1]])
>>> np.full_like(a, 2)
array([[2, 2, 2],
[2, 2, 2]])
随机抽样创建函数
函数名 | 功能 |
---|
numpy.random.rand(d0, d1, …, dn) | 返回给定形状且数据服从[0,1]均匀分布的随机数组 |
numpy.random.randn(d0, d1, …, dn) | 返回给定形状且数据服从标准正太分布的随机数组 |
numpy.random.randint(low, high=None, size=None, dtype=‘l’) | 返回给定长度且数据位于[low,high)区间内的随机序列 |
numpy.random.random/sample/random_sample(size=None) | 返回给定长度且数据服从[0.0,1.0)连续均匀分布的随机序列 |
numpy.random.choice(a, size=None, replace=True, p=None) | 返回给定长度的给定序列的采样序列,各元素可设置采样概率 |
numpy.random.uniform(low=0.0, high=1.0, size=None) | 从[low,high)均匀分布中抽取给定长度的序列 |
numpy.random.shuffle(x) | 就地打乱数组中第一轴元素的顺序 |
numpy.random.permutation(x) | 返回给定范围或原数组第一轴打乱顺序的新数组,不改变原数组 |
>>> np.random.rand(2,3)
array([[0.16570353, 0.34021874, 0.26847497],
[0.60324666, 0.11877294, 0.82235747]])
>>> np.random.randn(2,3)
array([[ 0.63707396, -1.12000625, 0.17249129],
[-1.67536893, 0.90606291, -1.53967973]])
>>> np.random.randint(1,5,10)
array([1, 2, 2, 1, 1, 1, 3, 3, 1, 3])
>>> np.random.random(5)
array([0.10541499, 0.91068358, 0.47769429, 0.15672546, 0.05310068])
>>> np.random.choice(10, 5)
array([6, 1, 8, 1, 5])
>>> np.random.choice([1,3,5], 5)
array([3, 5, 1, 1, 5])
>>> np.random.uniform(0,10,5)
array([8.53790866, 2.26243284, 8.27150196, 6.43238976, 7.82671429])
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> np.random.shuffle(a)
>>> a
array([[0, 1, 2],
[6, 7, 8],
[3, 4, 5]])
>>> np.random.permutation(a)
array([[3, 4, 5],
[6, 7, 8],
[0, 1, 2]])
>>> a
array([[0, 1, 2],
[6, 7, 8],
[3, 4, 5]])
数组的变形
一个数组具有由每个轴上的元素数量给出的形状,其可通过各种命令更改,常用的操作函数如下:
函数名(numpy.random) | 功能 |
---|
numpy.ravel(a, order=‘C’) | 返回包含给定数组所有元素的一维数组(一般为视图) |
numpy.reshape(a, newshape, order=‘C’) | 给定数组和形状,返回新数组(视图),元素个数与原数组相等 |
numpy.transpose(a, axes=None) | 返回转置后的数组(视图) |
numpy.resize(a, new_shape) | 给定数组和形状,返回新数组(副本),元素个数不必与原数组相等 |
>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> np.ravel(a)
array([0, 1, 2, 3, 4, 5])
>>> np.reshape(a, (3,2))
array([[0, 1],
[2, 3],
[4, 5]])
>>> np.transpose(a)
array([[0, 3],
[1, 4],
[2, 5]])
>>> np.resize(a, (2,2))
array([[0, 1],
[2, 3]])
>>> np.resize(a, (3,3))
array([[0, 1, 2],
[3, 4, 5],
[0, 1, 2]])
数组拼接
Numpy提供了多种函数将多个数组堆叠或拼接一个新数组,如可按指定轴拼接,常用的操作函数如下:
函数名 | 功能 |
---|
numpy.vstack(tup)/numpy.concatenate(tup,axis=0) | 返回给定的多个数组垂直堆叠的新数组,shape[0]增加 |
numpy.hstack(tup)/numpy.concatenate(tup,axis=1) | 返回给定的多个数组水平堆叠的新数组,shape[1]增加 |
numpy.stack(arrays, axis=0, out=None) | 返回给定的多个同形数组按给定轴堆叠的新数组,维度增1 |
numpy.column_stack(tup) | 返回给定的多个数组作为列堆叠的新数组 |
"""垂直/水平堆叠数组"""
>>> np.vstack(([1,2], [3,4]))
array([[1, 2],
[3, 4]])
>>> np.vstack(([[1,2], [3,4]], [[3,4]]))
array([[1, 2],
[3, 4],
[3, 4]])
>>> np.hstack(([1,2], [3,4]))
array([1, 2, 3, 4])
>>> np.hstack(([[1,2], [3,4]], [[3],[4]]))
array([[1, 2, 3],
[3, 4, 4]])
"""按轴0堆叠数组"""
>>> np.stack(([1,2,3], [4,5,6]), axis=0)
array([[1, 2, 3],
[4, 5, 6]])
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=0)
array([[[1, 2, 3]],
[[4, 5, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=0)
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
"""按轴1堆叠数组"""
>>> np.stack(([1,2,3], [4,5,6]), axis=1)
array([[1, 4],
[2, 5],
[3, 6]])
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=1)
array([[[1, 2, 3],
[4, 5, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=1)
array([[[ 1, 2, 3],
[ 7, 8, 9]],
[[ 4, 5, 6],
[10, 11, 12]]])
"""按轴2堆叠数组"""
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=2)
array([[[1, 4],
[2, 5],
[3, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=2)
array([[[ 1, 7],
[ 2, 8],
[ 3, 9]],
[[ 4, 10],
[ 5, 11],
[ 6, 12]]])
"""按列堆叠数组"""
>>> np.column_stack(([1,2],[4,5]))
array([[1, 4],
[2, 5]])
>>> np.column_stack(([[1,2],[4,5]], [10,11], [20,21]))
array([[ 1, 2, 10, 20],
[ 4, 5, 11, 21]])
数组拆分
Numpy提供了沿指定轴将一个数组拆分成多个子数组的函数,如下:
函数名(numpy.random) | 功能 |
---|
numpy.split(ary, indices_or_sections, axis=0) | 返回给定的数组按给定轴和给定位置拆分成的多个子数组 |
>>> x = np.arange(9.0)
>>> np.split(x, 3)
[array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7., 8.])]
>>> np.split(x, [3,5])
[array([0., 1., 2.]), array([3., 4.]), array([5., 6., 7., 8.])]
>>> x = np.arange(12).reshape(3,4)
>>> x
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.split(x,[1],axis=0)
[array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7], [ 8, 9, 10, 11]])]
>>> np.split(x,[2],axis=1)
[array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])]