numpy get started

numpy 提供了一种数组类型,高维数组, 提供了数据分析的运算基础(业务表一般就是二维)

import numpy as np

导入numpy库,并查看numpy版本

np.version

一、创建Array

1. 使用np.array()由python list创建

C 数组的概念 : 数据类型一致的一个连续的内存空间
python list列表 (C语言说:列表其实就是一个指针数组),列表不要求数据类型一致

numpy的数组:同样是一个【有序】的,【相同数据类型】的集合

[1, 3.14, ‘helloworld’, student]

参数为列表:
[1, 4, 2, 5, 3]

numpy设计初衷是用于运算的,所以对数据类型进行统一优化

注意:

  • numpy默认ndarray的所有元素的类型是相同的
  • 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int

[1,3.14, ‘hello’]

numpy的数组

array = np.array([1])

array

array

array

nd.array
np.array

import numpy as np

names = [“tom”,“lucy”,“jack”]

array1 = np.array(names)

array1

scores = [1.2, 3.4, 5.6]
array2 = np.array(scores)
array2

age = [15,16,18]
array3 = np.array(age, dtype=np.float32)
array3

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

2. 使用np的routines函数创建

包含以下常见创建方法:

  1. np.ones(shape, dtype=None, order=‘C’)

shape = (m,n) m行n列 二维数组
shape = (m) m个元素的一维数组 [1,2,3]
shape = (m,) m个元素的一维数组

shape = (m, 1) m行1列 二维数组 [[1],[2],[3]]
shape = (1, n) 1行m列 二维数组 [[1,2,3]]

构造一个5行3列的二维数组

np.ones(shape=(5,3), dtype=np.int8)

构造长度为3的一维数组

np.ones(shape=(3,))

np.ones(shape=(3))

构造一个5行1列的二维数组

np.ones(shape=(5,1))

构造1行3列的二维数组

np.ones(shape=(1,3))

  1. np.zeros(shape, dtype=float, order=‘C’)

np.zeros(shape=(5,6))

np.zeros(shape=(5))

np.zeros(shape=(5,3))

np.zeros(shape=(2,3,4))

  1. np.full(shape, fill_value, dtype=None, order=‘C’)

np.full(shape=(2,3), fill_value=6)

  1. np.eye(N, M=None, k=0, dtype=float)
    对角线为1其他的位置为0

单位矩阵 l2正则项

生成一个3阶单位矩阵(矩阵除法)

np.eye(N=3)

np.eye(N=5, M=4)

np.eye(N=5, k=-1)

  1. np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

等差数列

np.linspace(0,10,10, endpoint=False)

  1. np.arange([start, ]stop, [step, ]dtype=None)

np.arange(0,10,step=1)

  1. np.random.randint(low, high=None, size=None, dtype=‘l’)

size 同 shape

np.random.randint(0,100,size=(5,5))

  1. 正态分布函数
  • np.random.randn(d0, d1, …, dn) 标准正态分布
  • np.random.normal() 普通正态分布

np.random.randn(3,5)

np.random.normal(loc=170, scale=5, size=(5,3))

  1. np.random.random(size=None)

生成0到1的随机数,左闭右开

np.random.random(size=(5,5))

生成一组随机索引

np.random.permutation(10)

二、ndarray的属性

4个必记参数:

  • ndim:维度
  • shape:形状(各维度的长度)
  • size:总长度
  • dtype:元素类型

arr = np.random.randint(0,100,size=(5,4,3))

arr.ndim

arr.shape

arr.size

获取数组元素类型

arr.dtype

获取数组类型

type(arr)

创建
属性
如何访问
如何计算

三、ndarray的基本操作

data = [[1,2,3],[4,5,6]]

data[0]

data[0][0]

1. 索引

一维与列表完全一致
多维时同理

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

arr1[0]

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

列表的访问方式

arr2[0][0]

numpy特有的

arr[m,n…] 描述的是对应维度的索引值

arr2[0,0]

arr2[1,2]

高级用法

arr1

1. 使用列表作为索引访问

arr1[[0,1,2,0,1,2]]

2. 使用BOOL列表作为索引访问, True对应的值会被返回

bool_list = [True, False, True, False, True]
arr1[bool_list]

eg.获取数组中大于5的数

arr1[arr1 > 3]

arr3 = np.random.randint(0,10,size=(5,4,3))
arr3

arr3[2,0]

arr3[0,1,2]

赋值和访问没有区别,都可以使用

2. 切片

一维与列表完全一致
多维时同理

所有的切片方式都是开区间(左闭右开)

arr1[0:3]

arr2 = np.random.randint(0,100,size=(5,6))
arr2

行切片

arr2[0:2]

列切片 不论多少维,每一个维度的切片范围都是用冒号表示,使用逗号分割,最后一个维度可以省略,但是被切片的维度之前的维度不能省

arr2[:,0:2]

arr3 = np.random.randint(0,10,size=(3,4,5))
arr3

切前两个数组

arr3[0:2]

切割每一个二维数组的前两列

arr3[:,:,0:2]

切割每一个二维数组的前两行

arr3[:,0:2]

将数据反转,例如[1,2,3]---->[3,2,1]

arr1[::-1]

arr2

arr2[::-1]

arr2[:,::-1]

两个::进行切片

3. 变形

使用reshape函数,注意参数是一个tuple!

arr = np.random.randint(0,10,size=(20))
arr

arr.reshape((4,5))

arr.reshape(3,7)

4. 级联

  1. np.concatenate()
    级联需要注意的点:
  • 级联的参数是列表:一定要加中括号或小括号
  • 维度必须相同
  • 形状相符
  • 【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
  • 可通过axis参数改变级联的方向

arr1 = np.random.randint(0,10,size=(3,3))
arr2 = np.random.randint(10,20,size=(3,3))

display(arr1, arr2)

使用axis控制连接方向,axis指的是连接的维度

axis 注意轴 非常常见

np.concatenate((arr1, arr2), axis=1)

  1. np.hstack与np.vstack
    水平级联与垂直级联,处理自己,进行维度的变更

horizontal

np.hstack((arr1, arr2))

vertical

np.vstack((arr1, arr2))

【注意】:级联的时候
如果是横向级联,参与级联的数组的行数要一致
纵向级联,参与级联的数组的列数要一致
如果是高维数组的级联,级联的维度的数据个数要一致

5. 切分

与级联类似,三个函数完成切分工作:

  • np.split
  • np.vsplit
  • np.hsplit

arr = np.random.randint(0,100,size=(6,6))
arr

直接指定切分的份数

part1, part2 = np.split(arr, indices_or_sections=2)
display(part1, part2)

使用axis控制切分方向

part1, part2, part3 = np.split(arr, indices_or_sections=3, axis=1)
display(part1, part2, part3)

arr2 = np.random.randint(0,100,size=(3,7))
arr2

indices_or_sections=[m,n] 表示的范围是0:m, m:n, n:

part1, part2, part3 = np.split(arr2, indices_or_sections=[2,5], axis=1)
display(part1, part2, part3)

np.hsplit(arr2, indices_or_sections=[2,5])

6. 副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。

可使用copy()函数创建副本

copy_array = arr.copy()

arr

copy_array[0,0] = 1000

arr

copy_array

四、ndarray的聚合操作

arr

1. 求和np.sum

arr = np.random.randint(0,10,size=10)
arr

arr.sum()

求平均值

arr.mean()

arr.max()

arr.min()

求最大值索引

arr.argmax()

arr

arr.argmin()

标准方差

arr.std()

求方差

arr.var()

arr

注意这个语法格式

np.median(arr)

arr.median()

data = np.arange(0,11,step=1)
data

第一个参数是要求百分位数的数据

第二个参数是要求的百分位的位置

异常值检测会使用Q1 Q3

np.percentile(data, [0.25, 0.75])

平均值 (d1 + d2 + d3 + … dn)/n
中位数
方差 (d1-mean)**2 + (d2-mean)**2 + … + (dn-mean)**2/n
标注差 sqrt(方差)

any 检测一个BOOL数组中,是否至少存在一个True

all 检测一个BOOL数组中,是否全为True

bool_list = np.array([False, True, False, False])
bool_list.any()

bool_list = np.array([True, True, True, True])
bool_list.all()

a = 10

a > 10

找出一组数据中,所有大于该组数据平均值的值

arr

广播运算, 支持一个numpy.arry和任意一个数运算

condition = arr > arr.mean()
condition

arr[condition]

查看一个数组中,是否存在至少一个大于10的数

(arr > 10).any()

2. 最大最小值:np.max/ np.min

同理

any() 有True返回True

all() 有False返回False

3. 其他聚合操作

Function Name	NaN-safe Version	Description
np.sum	np.nansum	Compute sum of elements
np.prod	np.nanprod	Compute product of elements
np.mean	np.nanmean	Compute mean of elements
np.std	np.nanstd	Compute standard deviation
np.var	np.nanvar	Compute variance
np.min	np.nanmin	Find minimum value
np.max	np.nanmax	Find maximum value
np.argmin	np.nanargmin	Find index of minimum value
np.argmax	np.nanargmax	Find index of maximum value
np.median	np.nanmedian	Compute median of elements
np.percentile	np.nanpercentile	Compute rank-based statistics of elements
np.any	N/A	Evaluate whether any elements are true
np.all	N/A	Evaluate whether all elements are true
np.power 幂运算

np.sum 和 np.nansum 的区别
nan not a number

五、ndarray的矩阵操作

1. 基本矩阵操作

  1. 算术运算符:
  • 加减乘除
  1. 矩阵积np.dot()

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

使用符号是对应位置相乘

a * b

如果希望做数学中的矩阵运算

np.dot(a, b)

2. 广播机制

arr

3 3 3 3 3 3 3 3 3 3 3

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

arr + data

【重要】ndarray广播机制的两条规则

  • 规则一:为缺失的维度补1
  • 规则二:假定缺失元素用已有值填充

例1:
m = np.ones((2, 3))
a = np.arange(3)
求M+a

m = np.ones((2,3))
a = np.arange(3)
display(m, a)

m + a

m + 3

不能广播运算的例子

m = np.ones(shape=(3,3))
n = np.array([[1,2],[3,4]])
display(m, n)

m + n

例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b

a = np.arange(0,3,step=1).reshape((3, 1))
b = np.arange(3)
display(a, b)

a + b

习题
a = np.ones((4, 1))
b = np.arange(4)
求a+b

六、ndarray的排序

小测验:
使用以上所学numpy的知识,对一个ndarray对象进行冒泡排序。
def bubleSort(x):
代码越短越好

1. 快速排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort()不改变输入
  • ndarray.sort()本地处理,不占用空间,但改变输入

data = np.random.permutation(10)
data

data.sort()

data

np.sort(data)

2. 部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

  • 当k为正时,我们想要得到最小的k个数
  • 当k为负时,我们想要得到最大的k个数

data = np.random.permutation(10000)
data

np.partition(data, 4)[:4]

np.partition(data,-4)[-4:]在这里插入代码片