Python __ NumPy
概述
NumPy(Numerical Python)
是 Python 进行数值计算最重要的第三方模块。
需要引入模板import numpy as np
优点:
- 大部分代码是用 C 或者 Fortran 实现的,运行速度比纯 Python 代码要快。
- 不需要使用 for 或者 while 循环就可以完成整个数组的运算。
ndarray
是一种 N 维数组对象
是NumPy中存储和处理数据的数组对象。
特点:
- 可以定义维度, 适合做代数运算。
- 是标量元素之间的运算。
- 做运算是会自动迭代到数组内的所有元素
- 要求所有元素的数据类型是一致的,用dtype属性限制。
import numpy as np
rate_array = np.array([680.6, 800.05, 882.6, 87.79])
np.round((100000 * 100) / rate_array)
array([ 14693., 12499., 11330., 113908.])
属性
dtype 属性:表示数组的数据类型。
常用属性:
ndim 属性: ndim 属性用来查看数组的维数。
shape 属性: 通过 shape 属性得到的是数组的形状。
>>>n_array = np.ones((3,4))
>>>n_array.shape
输出:(3, 4)
“ : ”使用
[i:j:k]
表示从索引 i 到 j(不包含j)的这个区间内的元素,当k为正整数时,表示每k个取一次,当k为负整数的时候,表示每k个取一次,但是时倒着取
a[::2]
i 和 j 同时省略,表示所有元素,每2个元素取一个a[:4:1]
i 省略,表示从第一个元素到第3下标元素的这个区间,于是得到了 [1 2 3 4]a[2::1]
j 省略,表示从第2下标元素到最后一个元素,于是得到了 [3 4]
原文
创建
array() 方法:
将列表、元组、数组或其他序列类型转换为 ndarray 数组。
格式:
float_array = np.array([1, 2, 3, 4, 5], dtype=np.float64)
int_array = np.array([1, 2, 3, 4, 5])
arange() 方法:
与range()函数类似。
格式:
arange([start,] stop[, step,], dtype=None)
start 是可选参数, 代表起始值, 默认值为 0
stop 必须填写,代表截止值, 结果中并不包含该值;
step 是可选参数, 设置的是步长;
dtype 设置数据类型, 默认为 None 值,NumPy 将推测数组的数据类型。
ones()、zeros()、empty() 和 full() 方法
均可以接受一个元组作为数组的形状且 dtype 指定数据类型。
ones() 方法:产生全 1 数组。
zeros() 方法:产生全 0 数组。
empty() 方法:产生新数组,只分配空间不填充任何值。
full() 方法:利用指定值填充产生的数组。
格式:
np.ones((2, 3)) //2行3列
np.zeros((2, 3), dtype=np.int32)
np.full((2, 2), 5) //2行2列 用5填充
访问数组元素
普通索引
- 通过下标索引(整数索引)
close_price[0][1]
2.将每个维度的索引值列在中括号中的方式来获取对应位置的元素:
close_price[0, 1]//0行1列
切片
切片用于获取数组中的一小块数据。
Python 内置列表的切片相似:
close_price[0:2, 0::2]
用冒号连接给出切片起始位置、截止位置(不包含)和步长。
在对切片赋值时,可以将一个标量/数组/列表值赋给切片,这样的赋值操作会被扩散到整个切片 区域:
>>>close_price[:, -2] = 0
>>>close_price
array([[3.22, 3.21, 3.2, 0. , 3.2],
[3.19, 3.16, 3.17, 0. , 3.15],
[4.96, 4.93, 4.92, 0. , 4.89],
[6.21, 6.19, 6.13, 0. , 6.2]])
也可以使用数组或列表对切片赋值。数组或列表的形状与切片的形状一致或者 可广播(广播指的是不同形状的 NumPy 数组之间运算的执行方式)。
>>>close_price[:, -2] = [3.19, 3.15, 4.9, 6.17]
>>>close_price
array([[3.22, 3.21, 3.2 , 3.19, 3.2 ],
[3.19, 3.16, 3.17, 3.15, 3.15],
[4.96, 4.93, 4.92, 4.9 , 4.89],
[6.21, 6.19, 6.13, 6.17, 6.2 ]]))
布尔索引
NumPy数组的比较运算是矢量化的,
即数组和标量进行比较时,得到的是数组中每个元素与标量比较结果组成的布尔数组。
>>>bank_array = np.array(['中国银行', '农业银行', '工商银行', '建设银行'])
>>>bank_array == '农业银行'
array([False, True, False, False])
可以将这个布尔型的数组用于数组索引。
>>>close_price[bank_array=='农业银行']
array([[3.19, 3.16, 3.17, 3.15, 3.15]]) //匹配该关键字的行的数据
可以使用 &(和)、|(或)之类的布尔运算符组合多个条件。
布尔索引也可以用于设置数组中特定元素的值。
花式索引
花式索引是利用整数列表对数据进行索引。只需要传入一个用于指定顺序的整数列表或 ndarray 数组,就可以得到按照特定顺序选取的子集。
>>>bank_array = np.array(['中国银行', '农业银行', '工商银行', '建设银行'])
>>>bank_array[[3,2,1]]
array(['建设银行', '工商银行', '农业银行'], dtype='<U4'))
应用
获取大小在10~15的数据
def get10_15():
int_array=np.random.randint(0,15,10)
print(int_array)
index1=np.where((int_array>=10)&(int_array<=15))
print( int_array[index1] )
get10_15()
输出反转的二位数组的列
def getfjvr():
int_array=np.arange(1,60,2,dtype=int)
print(int_array)
int_array.resize((4,5))
print(int_array)
# int_array[:,[-1,0]]=int_array[:,[0,-1]]
print(int_array)
b=int_array[:,-1::-1]
print(b)
getfjvr()
找到一维数组的所有峰值
def getpeak():
int_array=np.random.randint(0,100,10)
print(int_array)
print("---------------")
print(int_array[np.where(np.sign(np.diff(int_array))==-1)])
print("---------------")
# 即:
maxn=np.diff(int_array)# 将峰值设为负数 后一项-前一项<0 即为峰值
maxid=np.sign(maxn)# 找到负数
peak_loc=np.where(maxid==-1)# 找到负数的下表
print(int_array[peak_loc])
getpeak()