python数据分析之Numpy模块学习

Python数据分析之Numpy

python有着大量的功能强大的第三方库,这些第三方库的=可以大大的扩充python的功能,我们在实际使用过程中往往也离不开这些第三方库。

numpy是python的一种开源的数值计算扩展,这种工具可用来储存的处理大型矩阵,比python本身的嵌套列表结构要高效的多numpy提供了许多高级的数值编程工具。其中一个重要的特性就是他的数组计算;

numpy的数组对象及其索引

numpy体验

在学习numpy之前我们先考虑这样的一个问题,我们拥有两个数值列表,现在想要使得列表中的每一个元素对应位置相加。我们首先能想到的是使用for循环实现这一操作:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = []
for i in range(0, len(a)):
    c.append(a[i] + b[i])
print(c)	# output:[6, 8, 10, 12]

也可以使用列表生成式实现

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]

c = [x + y for (x, y) in zip(a, b)]
print(c)

上面的代码已经是相当简洁了,但是在我们使用numpy时,实现改操作将更为简洁:

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

c = a + b
print(c)	output:[ 6  8 10 12]

每一个元素加一可以使用:

a = np.array([1, 2, 3, 4])
c = a + 1

数据类型

名称 描述
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8 字节(-128 to 127)
int16 整数(-32768 to 32767)
int32 整数(-2147483648 to 2147483647)
int64 整数(-9223372036854775808 to 9223372036854775807)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
float_ float64 类型的简写
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)

注意
数组的数据类型在数组创建时就定义了,但是可以使用astype函数转换dtype

float_arr=arr.astype(np.float64)

创建数组的方式

创建形式 函数方法
创建一个指定形状的数组 numpy.empty(shape, dtype = float, order = ‘C’)
从列表产生数组 np.array(list)
从列表传入 np.array([1, 2, 3, 4])
创建元素全为0的数组 numpy.zeros(shape, dtype = float, order = ‘C’)
创建元素全为1的数组 numpy.ones(shape, dtype = None, order = ‘C’)
从已有的数组创建数组 numpy.asarray(a, dtype = None, order = None)
从数值范围创建数组 numpy.arange(start, stop, step, dtype)
将数组的元素设置为指定数值 ndarray.fill(value)
生成等差数列 numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)[source]
生成[0, 1)的随机数数组 numpy.random.rand(shape)
生成标准正泰分布的随机数的数组 numpy.random.randn(shape)
生成正整数的随机数组 numpy.random.randint(low, high=None, size=None, dtype=int)

上面方法的参数说明

参数 描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序
a 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
start 起始值,默认为0
stop 终止值(不包含)
step 步长,默认为1
dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型

数组的属性

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性

类型查看

查看数组类型

type(a)

查看数组内数据的类型

a.dtype()

索引与切片

一维数组的索引与切片

一维数组的索引与列表类似,相关操作参考列表

a = np.array([1, 2, 3, 4, 5])

索引

# 索引,支持负索引
a[0]
# 索引修改
a[0] = 5

切片

a[1:3]

多维数组的索引与切片

a = np.array([range(0, 6), range(6, 12), range(12, 18), range(18, 24), range(24, 30)])

索引

# 索引得到某个元素
a[1, 3]		# a[行值, 列值]

# 索引得到某行元素
a[1]		# a[行值]

# 索引得到某列元素
a[:,3]		# a[:,列值]

切片

a[起始行数:终止行数:步长, 起始列数:终止列数:步长]	# 均为半开半闭的区间

切片是引用

切片在内存中使用的是引用机制;
引用机制意味着,python并没有为切片所得的值分配新的空间来储存它的值,而是让其指向了原数组的内存空间,因此改变索引的值将会改变原数组;
避免修改原数组的方法是使用copy()方法产生一个复制,这个复制会重新开辟一个新的内存空间;
列表的切片不存在这个问题;

花式索引

切片只能支持连续或者间隔的切片操作,要想实现任意位置的操作,需要使用花式索引:

一维花式索引

a = np.array(range(0, 15))

花式索引需要指定索引位置

index = [1, 2, -3]
a[index]

使用布尔数组来花式索引

a = np.array(range(0, 15))
bool = np.array([0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0], dtype=bool)
a[bool]

多维数组花式索引

a = np.array([range(0, 6), range(6, 12), range(12, 18), range(18, 24), range(24, 30), range(30, 36)])

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]

获取次对角线上的5个值

a[(0, 1, 2, 3, 4), (1, 2, 3, 4, 5)]	# a[(行值), (列值)]

使用布尔数组来花式索引
与一维数组的操作相同

where语句

a = np.array([1, 3, 13, 23, 1, 5])
a[a > 10]		# 返回a中大于10的所有元素
np.where(a > 10)	# 返回满足条件的索引值

NumPy 广播(Broadcast)

如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([1,2,3])
print(a + b)

python数据分析之Numpy模块学习_第1张图片

广播的规则

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
  • 输出数组的形状是输入数组形状的各个维度上的最大值。
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。- -
  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

数组操作

修改数组形状

函数 描述
numpy.reshape(arr, newshape, order=‘C’) 不改变数据的条件下修改形状
numpy.ndarray.flat 数组元素迭代器
ndarray.flatten(order=‘C’) 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
numpy.ravel(a, order=‘C’) 返回展开数组

翻转数组

函数 描述
numpy.transpose(arr, axes) 对换数组的维度
ndarray.T 和 self.transpose() 相同
numpy.rollaxis(arr, axis, start) 向后滚动指定的轴
numpy.swapaxes(arr, axis1, axis2) 对换数组的两个轴

修改数组维度

函数 描述
broadcast 产生模仿广播的对象
broadcast_to 将数组广播到新形状
expand_dims 扩展数组的形状
squeeze 从数组的形状中删除一维条目

连接数组

函数 描述
concatenate 连接沿现有轴的数组序列
stack 沿着新的轴加入一系列数组。
hstack 水平堆叠序列中的数组(列方向)
vstack 竖直堆叠序列中的数组(行方向)

分割数组

函数 描述
split 将一个数组分割为多个子数组
hsplit 将一个数组水平分割为多个子数组(按列)
vsplit 将一个数组垂直分割为多个子数组(按行)

数组元素的添加与删除

函数 描述
resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素

数组排序

sort函数
argsort函数

你可能感兴趣的:(数据分析)