NumPy(三):numpy基本属性fill/ndim/size演示,numpy数组索引和切片、索引数组、布尔类型索引

NumPy基本属性

1.fill、ndim、size演示
  • ndarray.fill将数组中的所有元素以指定的值填充

  • ndim返回数组的维数

  • size返回数组所含元素的总个数
  • import numpy as np
    array1 = np.array([1,2,3,4,5])
    array1.fill(0)
    print(array1)
    # 输出:[0 0 0 0 0]
    
    array2 = np.arange(10).reshape(2,5)
    #print(array2)
    print(array2.ndim)  # 2
    print(array2.size)  # 10
    
2."="赋值和.copy
  • "="可以将一个数组赋值给一个新的数组,也可以根据索引赋值新的元素

  • ".copy"用法:复制一个新的数组,不改变原来的数组

    x = np.array([[1,2,3],[4,5,6],[7,8,9]])
    y = x
    print(x)
    print(y)
    y[1,1] = 100  # 既改变了数组y,也改变了数组x
    print(x)
    
    #copy的用法:
    s = x.copy()
    s[1,1] = 1000 # 只改变了数组s,并未改变原数组x
    print(x)
    print(s)
    

索引和切片

1.数组索引:从0开始
  • 数组索引是指使用方括号([])来索引数组值。

  • 数组的索引与其他Python序列相同,都从0开始,并接受从数组末尾开始索引的负索引(最后一个元素索引为-1)

  • 与列表和元组不同的是,numpy数组支持多维数组的多维索引。

    import numpy as np
    array_x = np.arange(10)  # 注释为输出结果
    print(array_x)           # [0 1 2 3 4 5 6 7 8 9]
    print(array_x[0])        # 0
    print(array_x[2])        # 2
    print(array_x[-1])       # 9
    print(array_x[-2])       # 8
    
    # 多维数组的多维索引  
    x = array_x.reshape(2,5)  # x为二维数组,2行5列;不改变原数组array_x
    print(array_x)   # [0 1 2 3 4 5 6 7 8 9]
    print(x)
    '''输出结果:
    [[0 1 2 3 4]
     [5 6 7 8 9]]'''
    
    '''下面的输出结果也能得到一个shape为(2,3)的二维数组
    array_x.shape = (2,5) 
    print(array_x)
    '''
    print(x[1,3])   # 8
    print(x[1][3])  # 8
    print(x[1,-1])  # 9
    print(x[0])     # [0 1 2 3 4]
    print(x[1])     # [5 6 7 8 9]
    
2.数组切片
  • 可以对数组进行切片和跨步以提取具有相同数量的尺寸但具有与原始尺寸不同的数组。切片和跨步的工作方式与列表和元组的工作方式完全相同,只是数组切片可以应用于多个维度。

  • 数组切片不会复制内部数组数据,只会生成原始数据的新视图。

  • “:” 的意思为,取值从左往右,但不包括右

  • “:” 后面什么也不写表示取之后的所有值

    y = np.arange(10)
    print(y)         # [0 1 2 3 4 5 6 7 8 9]
    print(y[2:5])    # [2 3 4]
    print(y[:-7])    # [0 1 2]
    print(y[1:7:2])  # [1 3 5]注:y[1:7:2]表示取索引在区间[1,7)内,且步长为2的索引,即索引1,3,5
    print(y[-3:])    # [7 8 9]
    
    # 多维数组的切片
    x = np.arange(35).reshape(5,7)
    print(x)
    print(x[1:5:2,::3])  #1:5:2表示取索引为1,3的行,::3表示取索引为0,3,6的列
    '''输出结果:
    [[ 0  1  2  3  4  5  6]
     [ 7  8  9 10 11 12 13]
     [14 15 16 17 18 19 20]
     [21 22 23 24 25 26 27]
     [28 29 30 31 32 33 34]]
    [[ 7 10 13]
     [21 24 27]]'''
    
3.索引数组
  • NumPy数组可以使用其他数组(或任何其他可以转换为数组的类似序列的对象)作为索引。对于索引数组的所有情况,返回的是原始数据的副本,而不是切片获取的视图。

  • 索引数组必须是整数类型。数组中的每个值指示要使用的数组中的哪个值代替索引。

  • 允许使用负值

  • 索引值超出范围是错误的

  • 索引数组时返回的是与索引数组具有相同形状的数组

    x = np.arange(10,1,-1)
    s1 = np.array([3,3,1,8])
    s2 = np.array([3,3,-1,8])
    print(x)        # [10  9  8  7  6  5  4  3  2]
    print(x[s1])    # [7 7 9 2]
    print(x[s2])    # [7 7 2 2]
    #print(x[np.array[3,3,20,8]])   超出范围报错
    
    #索引数组时返回的是与索引数组具有相同形状的数组
    s = np.array([[1,1],[2,3]])
    print(x)     # [10  9  8  7  6  5  4  3  2]
    print(x[s])  
    '''
    [[9 9]
     [8 7]]'''
    

学习链接:https://www.numpy.org.cn/user/basics/indexing.html

4.布尔类型的索引
  • 在布尔类型中,0表示False,大于0表示True

  • 创建布尔类型的数组,dtype=bool

    grade = np.arange(0,100,10)  #假设这是一组成绩
    print(grade)  # [ 0 10 20 30 40 50 60 70 80 90]
    mask = np.array([0,0,0,0,0,0,1,1,1,1],dtype=bool) #将60分以上的选出来
    print(mask)   # [False False False False False False  True  True  True  True]
    print(grade[mask])  # [60 70 80 90]
    
    random_array = np.random.rand(10)
    print(random_array)
    mask = random_array > 0.5 #自动做判断,筛选出大于0.5的数字
    print(random_array[mask])
    '''输出结果如下:
    random_array:
    [0.04246453 0.86247479 0.49279673 0.26048207 0.56550633 0.17871151
     0.48849317 0.59024163 0.31977801 0.73402384]
    random_array[mask]:
    [0.86247479 0.56550633 0.59024163 0.73402384]'''
    
    numpy.random.rand():
        '''
        Numpy中的random.rand()主要用于返回一个或一组0到1之间的随机数或随机数组。
        numpy.random.rand(d1,d2,...)创建给定形状的数组,取值为[0,1)的随机数。
        1个参数表示一维数组,2个参数表示二维数组,3个参数表示三维数组...
        '''
    
  • 如果不使用T/F判断,则使用where函数进行索引,where函数会返回符合条件的元素的索引

    y = np.array([10,20,30,40,50])
    print(np.where(y>30))     # (array([3, 4], dtype=int64),)
    print(y[np.where(y>30)])  # [40 50]
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值