数据分析学习之路003——NumPy布尔索引、替换值、广播机制

NumPy库003布尔索引、替换值、广播机制

1、布尔索引

结果是生成一个新数组,根据条件来判断,新数组的元素都是True或False

import numpy as np
a1=np.arange(24).reshape((4,6))

print(a1>10)
'''
[[False False False False False False]
 [False False False False False  True]
 [ True  True  True  True  True  True]
 [ True  True  True  True  True  True]]
'''

print(a1[a1>10])
#[11 12 13 14 15 16 17 18 19 20 21 22 23]

print(a1[(a1>10) |(a1<5)])
#[ 0  1  2  3  4 11 12 13 14 15 16 17 18 19 20 21 22 23]

2、数组值的替换

  • 通过切片索引直接替换
  • 通过条件索引来替换
  • 通过函数来实现(生成新数组)
import numpy as np
a=np.zeros((3,3))
print(a)
'''
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]'''
#1通过索引切片实现
a[1]=[1,1,1]
print(a)
'''
[[0. 0. 0.]
 [1. 1. 1.]
 [0. 0. 0.]]
'''
a[2,2]=99
print(a)
'''
[[ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 0.  0. 99.]]
'''

#2通过条件来实现
a2=np.random.randint(0,20,size=(3,4))
print(a2)
'''[[ 5 17 17 11]
 [ 6  9  5 18]
 [ 8 15 14  3]]
'''

a2[a2<10]=0
print(a2)
'''[[ 0 17 17 11]
 [ 0  0  0 18]
 [ 0 15 14  0]]'''

#3通过函数来替换
a3=np.arange(24).reshape((4,6))
print(a3)
'''[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]'''

a4=np.where(a3<10,0,1)#把a3中元素小于10的变成0,其余变成1
print(a4)
'''[[0 0 0 0 0 0]
 [0 0 0 0 1 1]
 [1 1 1 1 1 1]
 [1 1 1 1 1 1]]'''

a5=np.where(a3<10)
print(a5)
# (array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=int64), array([0, 1, 2, 3, 4, 5, 0, 1, 2, 3], dtype=int64))
#这个就是符合where条件的索引

3、数组的广播机制

  • 数组与数的运算

    数组的每个元素与数进行运算

    import numpy as np
    a=np.random.randint(0,5,size=(3,3))
    
    print(a)
    '''[[4 3 1]
     [4 1 0]
     [4 4 0]]'''
    
    print(a*2)
    '''[[8 6 2]
     [8 2 0]
     [8 8 0]]'''
    # 原数组并没有发生改变哟
    
  • 数组与数组的运算

    • shape一致

      一一对应相运算

    import numpy as np
    a1=np.random.randint(0,5,size=(3,3))
    print(a1)
    '''[[2 4 3]
     [1 0 2]
     [3 3 1]]'''
    a2=np.random.randint(0,10,size=(3,3))
    print(a2)
    '''[[8 3 2]
     [9 5 9]
     [2 9 5]]'''
    print(a1+a2)
    '''[[10  7  5]
     [10  5 11]
     [ 5 12  6]]'''
    print(a1*a2)
    '''[[16 12  6]
     [ 9  0 18]
     [ 6 27  5]]'''
    
    • shape不一致

      不能通过广播方式进行计算。但是!

      如果行数相同,其中一个数组只有一列。(3,1)和(3,8)

      或者列数相同,其中一个数组只有一行(1,3)和(8,3),则可以进行运算

      import numpy as np
      a1=np.random.randint(0,10,size=(3,1))
      a2=np.random.randint(0,10,size=(3,4))
      
      print(a1)
      '''
      [[4]
       [1]
       [9]]'''
      
      print(a2)
      '''[[4 6 7 9]
       [4 9 3 5]
       [3 8 2 5]]'''
      
      print(a1+a2)
      '''
      [[ 8 10 11 13]
       [ 5 10  4  6]
       [12 17 11 14]]'''
      
      print(a1*a2)
      '''[[16 24 28 36]
       [ 4  9  3  5]
       [27 72 18 45]]
      '''
      
      a3=np.random.randint(0,10,size=(1,2))
      a4=np.random.randint(0,10,size=(3,2))
      
      print(a3)
      '''[[0 8]]'''
      
      print(a4)
      '''[[1 6]
       [2 0]
       [1 8]]'''
      
      print(a3+a4)
      '''[[ 1 14]
       [ 2  8]
       [ 1 16]]'''
      
      print(a3*a4)
      '''[[ 0 48]
       [ 0  0]
       [ 0 64]]'''
      

广播原则:

如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其 中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

shape 为 (3,8,2) 的数组能和 (8,3) 的数组不能进行运算

shape 为 (3,8,2) 的数组能和 (8,1) 的数组能进行运算

shape 为 (3,1,8) 的数组能和 (8,1) 的数组能进行运算

import numpy as np


a1=np.random.randint(0,10,size=(3,4,2))
a2=np.random.randint(0,10,size=(4,2))

print(a1)
'''[[[8 6]
  [2 2]
  [0 2]
  [3 3]]

 [[4 4]
  [1 1]
  [1 6]
  [7 4]]

 [[8 9]
  [5 4]
  [3 0]
  [3 0]]]'''

print(a2)
'''
[[4 0]
 [8 1]
 [1 2]
 [6 7]]'''

print(a1+a2)
'''
[[[12  6]
  [10  3]
  [ 1  4]
  [ 9 10]]

 [[ 8  4]
  [ 9  2]
  [ 2  8]
  [13 11]]

 [[12  9]
  [13  5]
  [ 4  2]
  [ 9  7]]]'''


a3=np.random.randint(0,10,size=(3,4,2))
a4=np.random.randint(0,10,size=(4,1))

print(a3)
'''
[[[3 8]
  [9 5]
  [4 2]
  [6 5]]

 [[9 3]
  [6 8]
  [0 2]
  [2 3]]

 [[3 2]
  [5 4]
  [8 5]
  [1 8]]]'''

print(a4)
'''
[[8]
 [0]
 [0]
 [5]]'''

print(a3+a4)
'''
[[[11 16]
  [ 9  5]
  [ 4  2]
  [11 10]]

 [[17 11]
  [ 6  8]
  [ 0  2]
  [ 7  8]]

 [[11 10]
  [ 5  4]
  [ 8  5]
  [ 6 13]]]'''


a5=np.random.randint(0,10,size=(3,1,4))
a6=np.random.randint(0,10,size=(3,4,1))

print(a5)
'''
[[[3 8 6 5]]

 [[4 3 2 9]]

 [[6 1 3 9]]]'''

print(a6)
'''
[[[4]
  [3]
  [5]
  [2]]

 [[0]
  [1]
  [6]
  [2]]

 [[9]
  [7]
  [0]
  [3]]]'''

print(a5+a6)
'''
[[[ 7 12 10  9]
  [ 6 11  9  8]
  [ 8 13 11 10]
  [ 5 10  8  7]]

 [[ 4  3  2  9]
  [ 5  4  3 10]
  [10  9  8 15]
  [ 6  5  4 11]]

 [[15 10 12 18]
  [13  8 10 16]
  [ 6  1  3  9]
  [ 9  4  6 12]]]'''

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值