Pandas是对Numpy的封装, 可以把dataframe看成一个带有许多统计函数的ndarray
取出dataframe的值赋给一个ndarray
nd1 = df1.values
数组切片
nd1[0:3, 1:3] # 取0,1,2行, 和1,2列
nd1[:, 3] # 取整个3列, 所有行
nd1[-1, 1:3] # 取最后一行, 1,2列
nd1[-2:, 1:3] # 取最后两行, 1,2列, -2:表示一直取到文件末尾\
nd1[:, 0:3:2] # 取所有行的第0和第2列, 步长为2代表间隔一列
通过传入序列创建数组
"""传入序列可以是列表或元组"""
np.array([2, 3, 4]) # 创建一维数组
np.array([(2, 3, 4), (4, 5, 6)]) # 创建二维数组
创建带有初始值的数组, 避免数组动态增长, 增加开销
np.empty(5)
np.empty((5, 4)) # 随机初始化
np.ones((5, 4)) # 全1数组, 默认浮点型
np.zeros((5, 4)) # 全0数组, 默认浮点型
np.empty()创建二维数组时实际上是读取内存中的数据, 相当于随机数, 默认为浮点型.
若想指定数据类型, 使用dtype参数
np.ones((5, 4), dtype=np.int_)
np.ones(), np.zeros(), np.empty()通常是创建数组的首选, 因为有更友好的界面, 要优于np.array()和np.ndarray()
指定范围创建随机数值数组:
np.ramdom.seed(693) # 随机种子, 保证随机数发生器每次得到相同的随机数
np.random.random((5, 4)) # 从[0.0, 1.0)的均匀分布中随机采样
np.random.rand(5, 4) # 不需要传入元组作为参数
np.random.normal(size=(2, 3)) # 标准正态分布, 均值0标准差1
np.random.normal(50, 10, size=(2, 3)) # 正态分布, 均值50标准差10
np.random.randint(10) # 均匀分布中的随机整数
np.random.randint(0, 10) # 与上面相同
np.random.randint(0, 10, size=(2, 3))
numpy.random.random:从范围为 [0.0, 1.0) 的均匀分布中抽样
numpy.random.rand:与 random
相似,但是语法有所不同
numpy.random.normal:正态(高斯)分布
numpy.random.randint:整数来自均匀分布
数组属性
array.shape # 返回形状元组, array.shape[0]行数, array.shape[1]列数
len(array.shape) # 返回维数
array.size # 返回元素个数
array.dtype # 返回数组数据类型
数组方法
array.sum() # 数组求和
array.sum(axis=0) # 按行求和, 将每一列的所有行元素加起来
array.sum(axis=1) # 按列求和, 将每一行的所有列元素加起来
array.min(axis=0) # 按行求最小值, 即求出每一列最小值
array.max(axis=1) # 按列求最大值, 即求出每一行最大值
array.mean() # 返回数组平均值
array.argmax() # 返回最大值和最大值的位置索引
数组修改值
a[0, :] = 2 # 修改整个行的值
a[:, 3] = [1, 2, 3, 4, 5] # 修改第3列
数组索引
a = np.random.rand(5)
indices = np.array([1, 1, 2, 3])
print a[indices] # 按索引列表取值
布尔型索引 & 掩码mask
mean = a.mean()
print a[a<mean] # 返回只有为True的位置组成的列表
a[a<mean] = mean # 小于平均值的用平均值代替
注意:表达式 a < mean 会生成一个布尔型数组,例如:
[[False, False, True, False, False, False, True, True, True],
[True, True, False, False, True, True, False, True, True]]
使用上述数组对数组 a 设定索引时,只有值为 True 的位置才会选中,并且这些值将添加到列表中。
数组运算
常数乘法: 2 * a 每一个元素都乘2, 生成一个新数组, 原数组不变
常数除法: a / 2 数组和除数都是整数, 则结果也会下取整为整数; a / 2.0则结果会保留为浮点数, 有一个是浮点数就行
数组加法: a + b 两个数组逐个元素相加, 二者形状必须相同
数组乘法: a * b 是逐个元素相乘, 不是返回矩阵乘法结果; np.dot(a, b)数组点积, 才是矩阵乘法结果
数组除法: a / b 逐个元素相除, 如果两个都是整型数组则结果也为整型(下取整)的数组