美文网首页
plt.imshow 和np.where函数及应用

plt.imshow 和np.where函数及应用

作者: 敬子v | 来源:发表于2023-01-12 17:10 被阅读0次

plt.imshow 对二维数组进行可视化操作

'''
plt.imshow 对二维数组进行可视化操作
'''
import numpy as np
import matplotlib.pyplot as plt
points=np.arange(-5,5,0.01) #生成1000个数
xs,ys=np.meshgrid(points,points)  #np.meshgrid接收两个一维数组
z=np.sqrt(xs**2+ys**2) #计算算数平方根
plt.imshow(z,cmap=plt.cm.gray)  #可视化二维数组,并设置为灰色
plt.title("Image plot")
plt.show()
image.png

np.where 将条件逻辑作为数组操作

  1. 逻辑运算

    1. 比较运算符 >, >=, <, <=, ==, != ,比较运算符,返回的是一个布尔数组。

    2. 逻辑运算符与:&, 或:|,非:~

    3. 二元通用函数与:logical_and, 或:logical_or, 非:lodical_not

      #比较运算符
      #向量化
      arr1 = np.random.randn(4,3)
      arr1
      """
      array([[-0.11644283,  0.26881624, -0.636891  ],
             [ 0.41491463,  0.75958032, -0.79139132],
             [-0.65056162, -1.65086047,  0.30840633],
             [ 0.44048015,  2.60792486, -1.2136428 ]])
      """
      arr1 < 1
      """
      array([[ True,  True,  True],
             [ True,  True,  True],
             [ True,  True,  True],
             [ True, False,  True]])
      """
      #数组与数组比较
      arr2 = np.random.randn(4,3)
      arr2
      """
      array([[ 1.07975731,  0.48405982,  0.83102948],
             [ 0.25161364, -0.84813959,  0.30692867],
             [ 0.67593645,  2.11885395,  0.52587073],
             [-0.82323498,  0.87254439, -0.55737282]])
      """
      arr1 > arr2
      """
      array([[False, False, False],
             [ True,  True, False],
             [False, False, False],
             [ True,  True, False]])
      """
      
      #逻辑运算符
      (arr1>-0.5) & (arr1<0.5)
      """
      array([[ True,  True, False],
             [ True, False, False],
             [False, False,  True],
             [ True, False, False]])
      """
      (arr1>-0.5) | (arr1<0.5)
      """
      array([[ True,  True,  True],
             [ True,  True,  True],
             [ True,  True,  True],
             [ True,  True,  True]])
      """
      ~(arr1>0)
      """
      array([[ True, False,  True],
             [False, False,  True],
             [ True,  True, False],
             [False, False,  True]])
      """
      
      #二元通用函数
      np.logical_and(arr1>-0.5 , arr1<0.5)
      """
      array([[ True,  True, False],
             [ True, False, False],
             [False, False,  True],
             [ True, False, False]])
      """
      np.logical_or(arr1>-0.5 , arr1<0.5)
      """
      array([[ True,  True,  True],
             [ True,  True,  True],
             [ True,  True,  True],
             [ True,  True,  True]])
      """
      np.logical_not(arr1>-0.5)
      """
      array([[False, False,  True],
             [False, False,  True],
             [ True,  True, False],
             [False, False,  True]])
      """
      
  2. np.where(condition, x, y):是三元表达式 x if condition else y的向量化。如果是True,输出x,相反,False,输出y。传递给np.where的数组可以是同等大小的数组,也可以是标量。

    #1.
    np.where([[True,False], [True,True]],   #condition
                 [[1,2], [3,4]],            #x
                 [[9,8], [7,6]])            #y
    """
    array([[1, 8],
           [3, 4]])
    """
    # 2.
    np.where(arr1>0) #只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
    """
    (array([0, 1, 1, 2, 3, 3], dtype=int64),
     array([1, 0, 1, 2, 0, 1], dtype=int64))
    """
    # 3. 典型用法,标量和数组联合,进行值的替换
    np.where(arr1>0,1,-1)
    """
    array([[-1,  1, -1],
           [ 1,  1, -1],
           [-1, -1,  1],
           [ 1,  1, -1]])
    """
    
  3. any(),all()方法: 这两个方法可以快速检查布尔数组,any():检查数组中是否至少有一个True, all():检查是否每个值都为True.

    (arr1 <1).sum() # True的个数
    11
    
    (arr1<1).any()
    True
    
    np.all((arr1<1))
    False
    # 这两个方法同时也可以适用于非布尔数组,非0的 元素就会按True处理
    
  4. 示例:随机生成均值为0 方差为1的随机变量

datas=np.random.randn(4,4) 
datas

array([[ 0.53508843, 0.36345913, 0.18894267, -0.56390073],
[-1.01228872, 0.96257198, 0.70456565, 0.58398519],
[-0.31654829, -1.32359181, -0.91207928, -1.43433188],
[-1.06724132, -1.69329212, -0.85644874, 1.23943039]])

判断数组的元素是否大于0

datas>0

array([[ True, True, True, False],
[False, True, True, True],
[False, False, False, False],
[False, False, False, True]])

判断数组的元素是否大于0,若大于0,替换为2,否则,替换为-2

np.where(datas>0,2,-2)

array([[ 2, 2, 2, -2],
[-2, 2, 2, 2],
[-2, -2, -2, -2],
[-2, -2, -2, 2]])

判断数组的元素是否大于0,若大于0,替换为2,否则,保持不变

np.where(datas>0,-2,datas)   

array([[-2. , -2. , -2. , -0.56390073],
[-1.01228872, -2. , -2. , -2. ],
[-0.31654829, -1.32359181, -0.91207928, -1.43433188],
[-1.06724132, -1.69329212, -0.85644874, -2. ]])

应用练习示例一:模拟随机漫步示例

'''
模拟随机漫步示例
'''
import random
import matplotlib.pyplot as plt
position=0
walk=[position]
steps=1000
for i in range(steps):
    step=1 if random.randint(0,1) else -1
    position+=step
    walk.append(position)
plt.plot(walk[:1000])
plt.show()
随机漫步

应用练习示例二:一次性模拟多次随机漫步

'''
一次性模拟多次随机漫步
'''
walks=50
steps=3
draws=np.random.randint(0,2,size=(walks,steps))
steps=np.where(draws>0,1,-1)
walks=steps.cumsum(0)  #按列加和
plt.plot(walks)
plt.show()
一次性模拟多次随机漫步

相关文章

网友评论

      本文标题:plt.imshow 和np.where函数及应用

      本文链接:https://www.haomeiwen.com/subject/qqrwcdtx.html