Python科学计算--NumPy的数组对象ndarray

NumPy是一个开源的Python科学计算基础库,包含:
  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合C/C++/Fortran代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

NumPy是SciPy、Pandas等数据处理或科学计算库的基础

Python已有列表类型,为什么需要一个数组对象?
  • 数组可以去掉元素间运算所需的循环,使一维向量更像单个数据
  • 设置专门的数组对象,经过优化,可以提升这类应用的运算速度
  • 数组对象采用相同的数据类型,有助于节省运算和存储空间
ndarray是一个多为数组对象,有两部分构成:
  • 实际的数据
  • 描述这些数据的元数据(数据维度、数据类型等)
ndarray数组一般要求所有数组元素类型相同(同质),数组下标从0开始

1. NumPy的引用

import numpy as np
尽管别名可以省略和更改,建议使用上述约定的别名

2. ndarray对象的属性



import numpy as np

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

a.ndim
Out[3]: 2

a.shape
Out[4]: (2, 5)

a.size
Out[5]: 10

a.dtype
Out[6]: dtype('int32')

a.itemsize
Out[7]: 4

3. ndarray数组的元素类型



4. ndarray数组的创建

4.1 从Python中的列表、元组等类型创建ndarray数组

x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型
x =np.array([0,1,2,3])      #从列表类型创建

print(x)
[0 1 2 3]

x = np.array((4,5,6,7))     #从元组类型创建

print(x)
[4 5 6 7]

x =np.array([[1,2],[9,8],(0.1,0.2)])     #从列表和元组混合类型创建

print(x)
[[ 1.   2. ]
 [ 9.   8. ]
 [ 0.1  0.2]]

4.2 使用NumPy中函数创建ndarray数组

如:arange, ones, zeros等


np.arange(10)
Out[14]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.ones((3,6))
Out[15]:
array([[ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.]])

np.zeros((3,6),dtype = np.int32)
Out[16]:
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

np.eye(5)
Out[17]:
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])

x = np.ones((2,3,4))

print(x)
[[[ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]]

 [[ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]
  [ 1.  1.  1.  1.]]]

x.shape
Out[20]: (2, 3, 4)


a = np.linspace(1,10,4)

a
Out[22]: array([  1.,   4.,   7.,  10.])

b = np.linspace(1,10,4,endpoint=False)

b
Out[24]: array([ 1.  ,  3.25,  5.5 ,  7.75])

c = np.concatenate((a,b))

c
Out[26]: array([  1.  ,   4.  ,   7.  ,  10.  ,   1.  ,   3.25,   5.5 ,   7.75])


5. ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换

5.1 ndarray数组的维度变换

a = np.ones((2,3,4), dtype=np.int32)

a.reshape((3,8))
Out[28]:
array([[1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1]])

a
Out[29]:
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

a.resize((3,8))

a
Out[31]:
array([[1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1]])

a.flatten()
Out[32]: array([1, 1, 1, ..., 1, 1, 1])

a
Out[33]:
array([[1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1],
       [1, 1, 1, ..., 1, 1, 1]])

b = a.flatten()

b
Out[35]: array([1, 1, 1, ..., 1, 1, 1])

5.2 ndarray数组的类型变换

new_a = a.astype(new_type)
a
Out[37]:
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

b = a.astype(np.float)

b
Out[39]:
array([[[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]]])

astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致

5.3 ndarray数组向列表类型转换

ndarray数组向列表类型转换
a = np.full((2,3,4),25,dtype=np.int32)

a.tolist()
Out[41]:
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
 [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

6. ndarray数组的操作


索引:获取数组中特定位置元素的过程
切片:获取数组元素自己的过程

6.1 一维数组的索引和切片

与Python的列表类似
a = np.array([9,8,7,6,5])

a[2]
Out[43]: 7

a[1:4:2]     #起始编号:终止编号(不含):步长,三元素冒号分割
Out[44]: array([8, 6])     #编号0开始从左递增,或-1开始从右递减

6.2 多维数组的索引

a = np.arange(24).reshape((2,3,4))

a
Out[46]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

a[1,2,3]
Out[47]: 23

a[0,1,2]
Out[48]: 6

a[-1,-2,-3]     #每个维度一个索引值,逗号分割
Out[49]: 17

6.3 多维数组的切片

a = np.arange(24).reshape((2,3,4))

a
Out[51]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

a[:,1,-3]     #选取一个维度用
Out[52]: array([ 5, 17])

a[:,1:3,:]     #每个维度切片方法与一维数组相同
Out[53]:
array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])

a[:,:,::2]     每个维度可以使用步长跳跃切片
Out[54]:
array([[[ 0,  2],
        [ 4,  6],
        [ 8, 10]],

       [[12, 14],
        [16, 18],
        [20, 22]]])

7. ndarray数组的运算

7.1 数组与标量之间的运算

数组与标量之间的运算作用于数组的每一个元素
a = np.arange(24).reshape((2,3,4))

a
Out[56]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

a.mean()
Out[57]: 11.5

a = a/a.mean()     #计算a与元素平均值的商

a
Out[59]:
array([[[ 0.        ,  0.08695652,  0.17391304,  0.26086957],
        [ 0.34782609,  0.43478261,  0.52173913,  0.60869565],
        [ 0.69565217,  0.7826087 ,  0.86956522,  0.95652174]],

       [[ 1.04347826,  1.13043478,  1.2173913 ,  1.30434783],
        [ 1.39130435,  1.47826087,  1.56521739,  1.65217391],
        [ 1.73913043,  1.82608696,  1.91304348,  2.        ]]])

7.2 NumPy一元函数

a = np.arange(24).reshape((2,3,4))

np.square(a)
Out[61]:
array([[[  0,   1,   4,   9],
        [ 16,  25,  36,  49],
        [ 64,  81, 100, 121]],
                                   #注意数组是否被真实改变
       [[144, 169, 196, 225],
        [256, 289, 324, 361],
        [400, 441, 484, 529]]], dtype=int32)

a = np.sqrt(a)

a
Out[63]:
array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],
        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],
        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],

       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],
        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],
        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])

np.modf(a)
Out[64]:
(array([[[ 0.        ,  0.        ,  0.41421356,  0.73205081],
         [ 0.        ,  0.23606798,  0.44948974,  0.64575131],
         [ 0.82842712,  0.        ,  0.16227766,  0.31662479]],

        [[ 0.46410162,  0.60555128,  0.74165739,  0.87298335],
         [ 0.        ,  0.12310563,  0.24264069,  0.35889894],
         [ 0.47213595,  0.58257569,  0.69041576,  0.79583152]]]),
 array([[[ 0.,  1.,  1.,  1.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  3.,  3.,  3.]],

        [[ 3.,  3.,  3.,  3.],
         [ 4.,  4.,  4.,  4.],
         [ 4.,  4.,  4.,  4.]]]))

7.3 NumPy二元函数

a = np.arange(24).reshape((2,3,4))

b = np.sqrt(a)

a
Out[72]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

b
Out[73]:
array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],
        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],
        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],

       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],
        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],
        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])

np.maximum(a,b)
Out[74]:
array([[[  0.,   1.,   2.,   3.],
        [  4.,   5.,   6.,   7.],
        [  8.,   9.,  10.,  11.]],

       [[ 12.,  13.,  14.,  15.],
        [ 16.,  17.,  18.,  19.],
        [ 20.,  21.,  22.,  23.]]])

a > b
Out[75]:
array([[[False, False,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]],

       [[ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]]], dtype=bool)

8. numPy的统计函数


import numpy as np

a = np.arange(15).reshape(3,5)

a
Out[13]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

np.sum(a)
Out[14]: 105

np.mean(a)
Out[15]: 7.0

np.mean(a,axis=0)
Out[16]: array([ 5.,  6.,  7.,  8.,  9.])

np.mean(a,axis=1)
Out[17]: array([  2.,   7.,  12.])

np.average(a,axis=0,weights=[10,5,1])
Out[18]: array([ 2.1875,  3.1875,  4.1875,  5.1875,  6.1875])

np.std(a)
Out[19]: 4.3204937989385739

np.var(a)
Out[20]: 18.666666666666668

b = np.arange(15,0,-1).reshape(3,5)

b
Out[23]:
array([[15, 14, 13, 12, 11],
       [10,  9,  8,  7,  6],
       [ 5,  4,  3,  2,  1]])

np.max(b)
Out[24]: 15

np.argmax(b)     #扁平化后的下标
Out[25]: 0

np.unravel_index(np.argmax(b),b.shape)     #重塑成多维下标
Out[26]: (0, 0)

np.ptp(b)
Out[27]: 14

np.median(b)
Out[28]: 8.0



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值