Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。
高性能科学计算和数据分析的基础包,用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。
本身是由C语言开发,是个很基础的扩展,Python其余的科学计算扩展大部分都是以此为基础。
ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间。
常用引用方法:import numpy as np
CSV(Comma-Separated Values,逗号分隔值)是存储表格数据的常用文件格式。很多应用都支持CSV格式,因为它很简洁。
和Python一样,CSV里留白(whitespace)也是很重要的:每一行都用一个换行符分隔,列与列之间用逗号分隔(因此也叫逗号分隔符)。CSV文件还可以用Tab字符或其他字符分隔行,但是不太常见,用的不多。
CSV数据存储
数据加载:np.loadtxt()
import numpy as np
filename = "./presidential_polls.csv"
data_arr = np.loadtxt(filename, #需要打开的文件名
delimiter = "," , #文件的分隔符
#skiprows = 1, #可以选择跳过开头指定的行
dtype=str, #数据是按编码后的字符串格式存储
usecols = (3,17,18,19), #表示读取文件里的列的索引位置
)
print(data_arr)
注意:skiprows = n,代表跳过开头前 n 行
数据加载:np. genfromtxt()
import numpy as np
filename = "./presidential_polls.csv"
data_arr = np.genfromtxt(filename, #需要打开的文件名
delimiter = "," , #文件的分隔符
dtype=str, #数据按字符串格式存储,不进行bytes编码
usecols = (3,17,18,19), #表示读取文件里列索引位置
)
print(data_arr)
注意:np. genfromtxt()方法中没有skiprows属性
ndarray数组创建
NumPy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力,并具有执行速度快和节省空间的特点。
注意:ndarray的下标从0开始,且数组里的所有元素必须是相同类型
ndarray属性:
ndim属性:维度个数
shape属性:维度大小
dtype属性:数据类型
ndarray的随机创建
通过随机抽样 (numpy.random) 生成随机数据
np.random.rand() # 随机样本位于[0, 1)中,rand固定区间0.0 ~ 1.0
np.random.randn() # 随机样本是从标准正态分布中返回一个或多个样本值
# 生成指定维度大小(m行n列)的随机多维整型数据(二维),randint()可以指定区间(x,y)
# size可省略不写
np.random.randint(x,y,size=(m,n))
np.random.randint(x,y,(m,n))
# 生成指定维度大小(m行n列)的随机多维浮点型数据(二维),uniform()可以指定区间(x, y)
# size可省略不写
np.random.uniform(x,y,size=(m,n))
np.random.uniform(x,y,(m,n))
例:
import numpy as np
arr = np.random.rand(2,2) # 创建一个随机样本在[0,1)且size为2行2列的数组
print(arr)
print(type(arr))
print('维度个数: ', arr.ndim)
print('维度大小: ', arr.shape)
print('数据类型: ', arr.dtype)
输出结果:
[[0.2669522 0.65501258]
[0.05080951 0.4335143 ]]
<class 'numpy.ndarray'>
维度个数: 2
维度大小: (2, 2)
数据类型: float64
ndarray的序列创建
1. np.array(collection)
collection 为序列型对象(list)、嵌套序列对象(list of list)。
list序列转换为 ndarray
list = range(10)
arr = np.array(list)
print(arr) # ndarray数据
list of list嵌套序列转换为ndarray
list_list = [range(10), range(10)]
arr = np.array(list_list)
print(arr) # ndarray数据
2. np.zeros()
指定大小的全0数组。
注意:第一个参数是元组,用来指定大小,如(3, 4)
例:
zeros_arr = np.zeros((3, 4))
print(zeros_arr)
输出结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
3. np.ones()
指定大小的全1数组。
注意:第一个参数是元组,用来指定大小,如(3, 4)
例:
ones_arr = np.ones((3, 4))
print(ones_arr)
输出结果:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
4. np.empty()
初始化数组,不是总是返回全0,有时返回的是未初始的随机值(内存里的随机值)。
empty_arr = np.empty((3, 3))
empty_int_arr = np.empty((3, 3), int) # 指定数据类型
print(empty_arr)
print(empty_int_arr)
输出结果:
[[0.00000000e+000 0.00000000e+000 0.00000000e+000]
[0.00000000e+000 0.00000000e+000 3.18178276e-321]
[9.34609110e-307 2.56761491e-312 2.56761491e-312]]
[[ 6881348 7340147 6357100]
[ 5439609 7471220 7209065]
[ 103 1920098592 1529379169]]
5. np.arange() 和 reshape()
arange() 类似 python 的 range() ,创建一个一维 ndarray 数组。
reshape() 将重新调整数组的维数。
print(np.arange(15)) # 15个元素的 一维数组
输出结果:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
print(arr.reshape(3, 5)) # 3x5个元素的 二维数组
输出结果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print(arr.reshape(1, 3, 5)) # 1x3x5个元素的 三维数组
输出结果:
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]]
ndarray数据类型
1. dtype参数
指定数组的数据类型,类型名+位数,如float64, int32
例:
初始化3行4列数组,数据类型为float64
zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
print(zeros_float_arr)
print(zeros_float_arr.dtype)
输出结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
float64
2. astype方法
转换数组的数据类型
例:
将已有的数组的数据类型转换为int32
zeros_int_arr = zeros_float_arr.astype(np.int32)
print(zeros_int_arr)
print(zeros_int_arr.dtype)
输出结果:
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
int32
ndarray的矩阵运算
ndarray的索引与切片
1. 一维数组的索引与切片
与Python的列表索引功能相似
arr1 = np.arange(10)
print(arr1) # [0 1 2 3 4 5 6 7 8 9]
print(arr1[2:5]) # [2 3 4] 索引从0开始
2. 多维数组的索引与切片
arr[r1:r2, c1:c2]
arr[1,1] 等价 arr[1][1]
[:] 代表某个维度的数据
arr2 = np.arange(12).reshape(3,4)
print(arr2)
print(arr2[1]) # 输出行索引为1 的行
print(arr2[0:2, 2:]) # 输出行索引为0,1的行,且列索引为2(包含2)以后的所有列
print(arr2[:, 1:3]) # 输出所有行,且列索引为1,2的列
输出结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[4 5 6 7]
[[2 3]
[6 7]]
[[ 1 2]
[ 5 6]
[ 9 10]]
3. 条件索引
布尔值多维数组:arr[condition],condition也可以是多个条件组合。
注意:多个条件组合要使用 & | 连接,而不是Python的 and or。
例:
单个条件: 找出 year_arr 中 2005年后的数据
year_arr = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]])
is_year_after_2005 = year_arr >= 2005
print(is_year_after_2005)
# print(is_year_after_2005.dtype) # bool
print(year_arr[is_year_after_2005])
输出结果:
[[False False False]
[ True False True]
[False False True]]
[2005 2009 2010]
多个条件:找出 year_arr 中 2005年以前的数据 且 年份可整除2
year_arr = np.array([[2000, 2001, 2000], [2005, 2002, 2009], [2001, 2003, 2010]])
is_year_before_2005 = (year_arr <= 2005) & (year_arr % 2 == 0)
print(is_year_before_2005)
print(year_arr[is_year_before_2005])
输出结果:
[[ True False True]
[False True False]
[False False False]]
[2000 2000 2002]