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 将条件逻辑作为数组操作
-
逻辑运算
-
比较运算符
>, >=, <, <=, ==, !=
,比较运算符,返回的是一个布尔数组。 -
逻辑运算符
与:&, 或:|,非:~
-
二元通用函数
与: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]]) """
-
-
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]]) """
-
any(),all()方法
: 这两个方法可以快速检查布尔数组,any()
:检查数组中是否至少有一个True,all()
:检查是否每个值都为True.(arr1 <1).sum() # True的个数 11 (arr1<1).any() True np.all((arr1<1)) False # 这两个方法同时也可以适用于非布尔数组,非0的 元素就会按True处理
-
示例:随机生成均值为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()
一次性模拟多次随机漫步
网友评论