(一)NumPy基础:数组和矢量计算

时间:2021-12-16 00:24:40

一、创建ndarray

1、各种创建函数的使用

import numpy as np #创建ndarray #1、array方法
data1 = [[6, 7.5, 8, 0, 1], [2, 8, 9.5, 10, 8]] # 生成数组
arr1 = np.array(data1) ''' shape-------->数组的形状 dtype-------->数组的数据类型 ndim--------->数组的维度 '''
print(arr1.shape, arr1.dtype, arr1.ndim) ''' arange------->类似于range,返回数组 ones---------->参数是一个元祖,返回全一数组 ones_like----------->返回相同形状的数组,参数是数组 eye----------->单位矩阵 '''
print(np.arange(10)) print(np.zeros((3, 3))) print(np.ones_like(arr1)) print(np.eye(10))

二、adarray的数据类型

1、dtype是一个属性,他可以确定一个数组的数据类型

import numpy as np data1 = [[1, 2, 3, 4], [8, 9, 10, 11]] #数据类型是一个类型名加一个表示各元素位长的数字
narr1 = np.array(data1, dtype = np.float64) print(narr1)

2、数据类型转换(astype)

import numpy as np data1 = [[1.8, 2.9, 3.7, 4], [8, 9, 10.8, 11]] #数据类型是一个类型名加一个表示各元素位长的数字
narr1 = np.array(data1, dtype = np.float64) #函数astype返回仍是数组,可以设置类型
print(narr1.astype(np.int64))

三、数组与标量的运算

数组可以使你不用编写循环即可对数据执行批量运算,通常叫做矢量化

import numpy as np data1 = [[1, 2, 3, 4], [5, 6, 7, 8]] narr1 = np.array(data1) #乘法运算
print(narr1*narr1) #减法运算
print(narr1-narr1) #除法运算
print(1/narr1) #开方运算
print(narr1**2)

 四、基本的索引和切片

1、将一个标量值赋给一个切片时,该值会自动传播到整个选区,跟列表最重要的区别在于,数组切片是原始数组的视图,数据不会被复制,视图上的任何修改都会直接反映到源数组上

import numpy as np arr = np.arange(10) print(arr) #([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[5])  #5
print(arr[5:8])  #[5, 6, 7]
arr[5:8] = 12  #对arr[5:8]赋值,使得原数组改变
print(arr) ''' 即使将切片赋予一个新的变量,改变新 变量的值,仍然会改变原数组 ''' arr_slice = arr[5:8] arr_slice[1] = 12345
print(arr)   #[ 0 1 2 3 4 12 12345 12 8 9]

2、索引

import numpy as np arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr2d) print(arr2d[0])   #访问第0行
print(arr2d[0][1])   #访问第0行,第1列
print(arr2d[0, 1])   #访问第0行,第1列
 arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(arr3d[0, 1, 1])   #5

3、布尔型索引

import numpy as np names = np.array(["Bob", 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) data = np.random.randn(7, 4)  #生成正态分布的随机数据
print(data) print(names == 'Bob') '''假设每个名字对应data数组中的一行,想要选出对应于名字‘Bob’的所有行,跟算术运算一样,数组的比较运算 也是矢量化的,'''
print(data[names == "Bob"])

4、数组转置和轴对换

a、转置(transpose)是重塑的一种特殊形式,它返回的是源数据的视图,数组不仅有transpose方法,还有一个特殊的T属性

import numpy as np arr = np.arange(15).reshape(3, 5) print(arr) print(arr.T)   #转置
print(np.transpose(arr))#转置

5、通用函数

通用函数是一种对ndarray中数据执行元素级运算的函数,在做简单的矢量化包装器

import numpy as np arr = np.arange(10) print(np.sqrt(arr))  #求每个元素的开方
print(np.exp(arr))  #求自然常数的方
 x = np.random.randn(10) y = np.random.randn(10) print(x) print(y) print(np.maximum(x, y))   #接受两个数组,返回一个结果数组

6、利用数组进行数据处理

Numpy数组使得可以将许多数据处理任务表述为简洁的数组表达式,用数组表达式代替循环的做法称为矢量化。

import numpy as np import matplotlib.pyplot as plt points = np.arange(-5, 5, 0.01)   #1000个间隔相等的点
xs, ys = np.meshgrid(points, points) print(ys) z = np.sqrt(xs**2+ys**2) plt.imshow(z, cmap=plt.cm.gray) plt.colorbar() plt.title("Image plot of $\sqrt{x^2+y^2}$for a grid of values") plt.show()

(一)NumPy基础:数组和矢量计算

7、数学和统计方法---通过数组上的一组数学函数对整个数组或者某个轴向的数据进行统计计算

import numpy as np arr = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr.mean()) print(arr.sum()) print(arr.mean(axis=1)) print(arr.cumsum())   #累计和
print(arr.cumprod())  #累计积
print(arr.std())  #标准差
print(arr.var())   #方差

8、  随机漫步

import random import matplotlib.pyplot as plt position = 0 walk = [position] steps = 100
for i in range(steps): step = 1 if random.randint(0, 1) else -1 position += step walk.append(position) plt.plot(range(101), walk) plt.show()

(一)NumPy基础:数组和矢量计算

import numpy as np import matplotlib.pyplot as plt
#数组实现 position
= 0 nsteps = 100 draws = np.random.randint(0, 2, size=nsteps) steps = np.where(draws > 0, 1, -1) walk = steps.cumsum() print(walk) plt.plot(range(100), walk) plt.show()

(一)NumPy基础:数组和矢量计算

9、一次模拟多个随机漫步

import numpy as np import matplotlib.pyplot as plt nwalks = 5000 nsteps = 1000 draws = np.random.randint(0, 2, size=(nwalks, nsteps)) steps = np.where(draws > 0, 1, -1) walks = steps.cumsum(1) print(walks.max()) print(walks.min()) print(walks) hits30 = (np.abs(walks) >= 30).any(1) print(hits30) print(hits30.sum())