Numpy数组的创建、变形、拼接及拆分

数组创建

数组创建有多种方法,如

  • 使用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 )		# it accepts float arguments
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 )		# 9 numbers from 0 to 2
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))				# uninitialized, output may vary
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]))					# 形状(,2) + (2,) -> (2,2)
array([[1, 2],
       [3, 4]])
>>> np.vstack(([[1,2], [3,4]], [[3,4]]))			# 形状(2,2) + (1,2) -> 3*2
array([[1, 2],
       [3, 4],
       [3, 4]])
>>> np.hstack(([1,2], [3,4]))					# 形状(2,) + (2,) -> (4,)
array([1, 2, 3, 4])
>>> np.hstack(([[1,2], [3,4]], [[3],[4]]))			# 形状(2,2) + (2,1) -> (2,3)
array([[1, 2, 3],
       [3, 4, 4]])

"""按轴0堆叠数组"""
>>> np.stack(([1,2,3], [4,5,6]), axis=0)			# 形状(3,) + (3,) -> (2,3)
array([[1, 2, 3],
       [4, 5, 6]])   
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=0)			# 形状(1,3) + (1,3) -> (2,1,3)
array([[[1, 2, 3]],

       [[4, 5, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=0)	# 形状(2,3) + (2,3) -> (2,2,3)
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

"""按轴1堆叠数组"""
>>> np.stack(([1,2,3], [4,5,6]), axis=1)			# 形状(3,) + (3,) -> (3,2)
array([[1, 4],
       [2, 5],
       [3, 6]])  
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=1)			# 形状(1,3) + (1,3) -> (1,2,3)
array([[[1, 2, 3],
        [4, 5, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=1)	# 形状(2,3) + (2,3) -> (2,2,3)
array([[[ 1,  2,  3],
        [ 7,  8,  9]],

       [[ 4,  5,  6],
        [10, 11, 12]]])

"""按轴2堆叠数组"""
>>> np.stack(([[1,2,3]], [[4,5,6]]), axis=2)			# 形状(1,3) + (1,3) -> (1,3,2)
array([[[1, 4],
        [2, 5],
        [3, 6]]])
>>> np.stack(([[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]), axis=2)	# 形状(2,3) + (2,3) -> (2,3,2)
array([[[ 1,  7],
        [ 2,  8],
        [ 3,  9]],

       [[ 4, 10],
        [ 5, 11],
        [ 6, 12]]])

"""按列堆叠数组"""
>>> np.column_stack(([1,2],[4,5]))			# np.hstack(([[1],[2]],[[4],[5]]))
array([[1, 4],
       [2, 5]])
>>> np.column_stack(([[1,2],[4,5]], [10,11], [20,21]))	# np.hstack(([[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]])]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值