numpy 数组初始化及常用操作1

版权声明:本文为作者原创文章,如转载请注明出处。

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

1 数组初始化

利用以下编程实现数组的初始化,其中a为一维数组,b为二维数组。数组的数据类型为ndarray。

>>>import numpy as np
>>>a = np.array([1, 2, 3])
>>>b = np.array([[1.0, 2.0, 3.0]])
>>>type(a)
numpy.ndarray

数组的属性主要有

函数作用
ndarray.ndim数组的维数
ndarray.shape数组每一维的大小
ndarray.size数组中全部元素的数量
ndarray.dtype数组中元素的类型
>>>a.ndim
1
>>>b.ndim
2
>>>a.shape
(3,)
>>>b.shape
(1, 3)
>>>a.size
3
>>>b.size
3
>>>a.dtype
dtype('int32')
>>>b.dtype
dtype('float64')

在构建二维数组时,以下写法是等价的

b=np.array([[1,2,3],[2,3,4]])
b=np.array([(1,2,3),(2,3,4)])

b被初始化为2行3列的数组。
其他具有特殊形式的数组初始化包括

函数作用
zeros生成全零数组
ones生成全1数组
random.rand生成0~1随机数数组
random.randn生成高斯白噪声数组
arange生成等差序列(最小值,最大值,步长)(左闭右开)
linspace生成等差序列(最小值,最大值,元素数量)
logspace生成等比序列(最小值,最大值,元素数量)
>>>np.zeros((2,3))
array([[0.,0.,0.],
		[0.,0.,0.]])
>>>np.ones((2,3))
array([[1.,1.,1.],
		[1.,1.,1.]])
>>>np.random.rand(2,3)
array([[0.31905417, 0.2894161 , 0.11942199],
       [0.20105854, 0.6181635 , 0.3389883 ]])
>>>np.random.randn(2,3)
array([[-1.38620042, -0.48860544,  1.14047967],
       [ 0.07611736, -0.03401363,  1.17474093]])
>>>np.arance(5)
array([0, 1, 2, 3, 4])
>>>np.arange(1,4,2)
array([1,3])
>>>np.arange(1,4,5)
array([1])
>>>np.linspace(1,3,2)
array([1., 3.])
>>>np.linspace(1,3,3)
array([1.,2.,3.])
>>>np.logspace(1,2,3)
array([10, 31.6227766, 100.])

注意,在生成二维数组时zeros和ones需要2个括号,而randn和rand只需要1个括号。

2 数组索引

ndarray可以根据下标进行索引,例如

>>>import numpy as np
>>>a=np.arange(5)
>>>a[2:]
array([2,3,4])

a[2:]代表从下标2开始到最后一个元素,如果a为2位数组

>>>a=np.array([[1,2,3],[3,4,5],[5,6,7])
>>>a[1]
array([3, 4, 5])
>>>a[0]
array([1, 2, 3])
>>>a[:,0]
array([1, 3, 5])
>>>a[1:]
array([[3, 4, 5],
       [5, 6, 7]])

数组的索引还可以采用数组等形式,例如

>>>a=np.array([[1,2,3],[3,4,5],[5,6,7]])
>>>a[[0,0],[1,2]]
array([2, 3])

索引为1维数组,则输出也为1维数组。

>>>a=np.array([[1,2,3],[3,4,5],[5,6,7]])
>>>a[[[0,0]],[[1,2]]]
array([[2, 3]])

3 数组操作

1 数组形状改变

numpy中一些改变形状的基本操作函数包括

函数作用
ndarray.reshape修改数组形状
ndarray.flatten展开数组
ndarray.ravel展开数组
ndarray.transpose数组转置
ndarray.T数组转置
>>>import numpy as np
>>>np.arange(6).reshape(2,3)
array([[0, 1, 2],
	   [3, 4, 5]])
>>>np.arange(6).reshape(2,3,order='F')
array([[0, 2, 4],
       [1, 3, 5]])

order='F’为按列优先。reshape的一个重要应用是将1维数组转化为2维数组。

>>>a=np.arange(6)
>>>a.shape
(6,)
>>>a.reshape(-1,1).shape
(6,1)

flatten和ravel展开数组。一个重要应用为将2维数组转化为1位数组。

>>>a=np.random.rand(2,3)
>>>a
array([[0.30199408, 0.25455279, 0.6133811 ],
       [0.58353598, 0.47853292, 0.16076661]])
>>>a.flatten()
array([0.30199408, 0.25455279, 0.6133811 , 0.58353598, 0.47853292,
       0.16076661])
>>>a.flatten(order='F')
array([0.30199408, 0.58353598, 0.25455279, 0.47853292, 0.6133811 ,
       0.16076661])
>>>a
array([[0.30199408, 0.25455279, 0.6133811 ],
       [0.58353598, 0.47853292, 0.16076661]])
>>>b=np.random.rand(2,3)
>>>b
array([[0.08822681, 0.36100632, 0.34778518],
      [0.69348275, 0.56395085, 0.13447211]])
>>>b.ravel()
array([0.08822681, 0.36100632, 0.34778518, 0.69348275, 0.56395085,
      0.13447211])
>>>b
array([[0.08822681, 0.36100632, 0.34778518],
      [0.69348275, 0.56395085, 0.13447211]])

注意,展开后为1维数组。
transpose和.T实现的功能相同

>>>a=np.random.randn(2,3)
>>>a
array([[-0.14805005,  0.17839168, -0.29578494],
       [-0.9402365 ,  0.25468339, -0.4984622 ]])
>>>a.T
array([[-0.14805005, -0.9402365 ],
       [ 0.17839168,  0.25468339],
       [-0.29578494, -0.4984622 ]])       
>>>a.transpose()
array([[-0.14805005, -0.9402365 ],
       [ 0.17839168,  0.25468339],
       [-0.29578494, -0.4984622 ]])      

如果数组为1维,则转置后形状不变。

2 数组大小改变

numpy中一些改变维度的基本操作函数包括

函数作用
concatenate连接数组
stack堆叠数组
split分割数组
resize改变形状
append连接数组
c_按列连接数组
r_按行连接数组

concatenate可以指定数组连接的方向,例如

>>>a=np.random.rand(2,3)
>>>a
array([[0.62731757, 0.06101328, 0.53636444],
       [0.30521324, 0.81380523, 0.6092952 ]])
>>>b=np.random.rand(2,3)
>>>b
array([[0.29411635, 0.51718227, 0.95680934],
       [0.46014451, 0.88268582, 0.28879407]])
>>>np.concatenate((a,b),axis=0)
array([[0.62731757, 0.06101328, 0.53636444],
       [0.30521324, 0.81380523, 0.6092952 ],
       [0.29411635, 0.51718227, 0.95680934],
       [0.46014451, 0.88268582, 0.28879407]])
 >>>np.concatenate((a,b),axis=1)
 array([[0.62731757, 0.06101328, 0.53636444, 0.29411635, 0.51718227,
        0.95680934],
       [0.30521324, 0.81380523, 0.6092952 , 0.46014451, 0.88268582,
        0.28879407]])

两个2维数组连接后形成1个新的2维数组。

stack在一个新轴上堆叠两个数组。

>>>a=np.random.rand(4)
>>>a
array([0.65561299, 0.92880979, 0.70053707, 0.2477169 ])
>>>b=np.random.rand(4)
>>>b
array([0.06784493, 0.06937954, 0.78623732, 0.54809845])
>>>np.stack((a,b),0)
array([[0.65561299, 0.92880979, 0.70053707, 0.2477169 ],
       [0.06784493, 0.06937954, 0.78623732, 0.54809845]])
>>>np.stack((a,b),1)  
array([[0.65561299, 0.06784493],
       [0.92880979, 0.06937954],
       [0.70053707, 0.78623732],
       [0.2477169 , 0.54809845]])

两个1维数组堆叠后形成1个2维数组。

split沿特定的轴将数组分割为子数组

>>>a=np.random.randn(4,5)
>>>a
array([[ 2.40972819,  0.17073943, -0.32520903,  0.37527934, -0.44940999],
       [ 1.11282662,  0.93766537,  0.18270784, -0.4313148 ,  0.00847806],
       [ 0.14329614, -0.40554115, -1.18391688,  0.1798149 ,  1.42850581],
       [ 0.73440022,  1.04653029, -0.24898286, -1.52401808,  0.39199935]])
>>>b=np.split(a,4)
>>>b
[array([[ 2.40972819,  0.17073943, -0.32520903,  0.37527934, -0.44940999]]),
 array([[ 1.11282662,  0.93766537,  0.18270784, -0.4313148 ,  0.00847806]]),
 array([[ 0.14329614, -0.40554115, -1.18391688,  0.1798149 ,  1.42850581]]),
 array([[ 0.73440022,  1.04653029, -0.24898286, -1.52401808,  0.39199935]])]
>>>b[0]
array([[ 2.40972819,  0.17073943, -0.32520903,  0.37527934, -0.44940999]])
>>>b=np.split(a,5,axis=1)
[array([[2.40972819],
        [1.11282662],
        [0.14329614],
        [0.73440022]]),
 array([[ 0.17073943],
        [ 0.93766537],
        [-0.40554115],
        [ 1.04653029]]),
 array([[-0.32520903],
        [ 0.18270784],
        [-1.18391688],
        [-0.24898286]]),
 array([[ 0.37527934],
        [-0.4313148 ],
        [ 0.1798149 ],
        [-1.52401808]]),
 array([[-0.44940999],
        [ 0.00847806],
        [ 1.42850581],
        [ 0.39199935]])]
>>>b[0]
array([[2.40972819],
       [1.11282662],
       [0.14329614],
       [0.73440022]])        

resize当元素的个数不够时,将重复原有的数据元素。

>>>a=array([1,2,3])
>>>np.resize(a,(3,2))
array([[1, 2],
       [3, 1],
       [2, 3]])

append在数组后末尾增加值。append返回的是一个1维数组。

>>>a=np.array([[1,2,3],[4,5,6]])
>>>np.append(a,np.random.rand(1,4))
array([1.        , 2.        , 3.        , 4.        , 5.        ,
       6.        , 0.72942326, 0.05937261, 0.11647261, 0.69093236])

按列和行连接数组时可以分别用c_和r_来实现

>>>a=np.random.rand(2,3)
>>>a
array([[0.74297412, 0.57588444, 0.13784099],
       [0.65399833, 0.00539755, 0.05718673]])
>>>b=np.random.rand(1,3)
>>>b
array([[0.50917403, 0.42079401, 0.96578048]])
>>>np.r_[a,b,a]
array([[0.74297412, 0.57588444, 0.13784099],
       [0.65399833, 0.00539755, 0.05718673],
       [0.50917403, 0.42079401, 0.96578048],
       [0.74297412, 0.57588444, 0.13784099],
       [0.65399833, 0.00539755, 0.05718673]])
>>>np.c_[a,np.r_[b,b]]
>array([[0.74297412, 0.57588444, 0.13784099, 0.50917403, 0.42079401,
        0.96578048],
       [0.65399833, 0.00539755, 0.05718673, 0.50917403, 0.42079401,
        0.96578048]])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值