【数据分析】Numpy入门教程(超详细)

article/2025/10/15 20:22:01

Numpy 教程

什么是Numpy?Numpy(Numerical Python)是一个Python扩展库,支持大量的维度数组和矩阵运算,此外也针对数组运算提供大量的数学函数库。

其主要用于数组计算,特点包括:

  • 一个强大的N维数组对象ndarray
  • 广播功能函数
  • 整合C/C++/Fortran代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

一、Ndarray对象

Ndarray(N-dimension array)是一个N维数组对象,他是一系列同类型数据的集合。

其内部构成为:

  • 一个指向数据的指针
  • 数据类型dtype,描述在数组中的固定大小的格子
  • 一个表示数组形状shape的元组
  • 一个跨度元组stride,也就是我们索引切片的时候选择的跨度

风格印象🐉

  • 快!很快!非常快!

ndarray中所有元素类型都是相同的,其存储位置是连续的!可以免去寻址步骤节省时间!

  • 全局解释器锁(Global Interpreter Lock)

Numpy 底层通过C编写,解除了GIL,其效率远高于纯Python!


下面我们来看看具体的生成器:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
'''object: 数组或嵌套的数列dtype: 数据类型copy: 对象是否需要复制(new的内存空间)order: 创建数组的样式,A为任意方向,C为行方向,F为列方向subok: 返回一个与基类型一致的数组ndmin: 指定生成数组的最小维度
'''

生成最小维度

# 最小维度  
import numpy as np 
a = np.array([1, 2, 3, 4, 5], ndmin =  2)  
print (a)# [[1 2 3 4 5]]

ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块的一个位置。


二、数据类型

名称描述
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 位浮点数(实数部分和虚数部分)

三、数组属性

Numpy的数组维度数量称为秩(rank),每一个线性的数组是一个轴(axis),也就是维度。

例如:二维数组由两个一维数组构成:

[[1,2,3],[4,5,6],[7,8,9]]# [A,B,C]# 或者是:
# [ A,
#	B,
#   C ]# A=[1,2,3]

第一个一维数组中的每个元素又是一个一维数组。第一个轴也成为了底层数组,第二个则是底层数组中的数组,以此类推。

简单说一下,axis=0的情况表示沿着第0轴进行操作,也就是列,axis=1则是沿着第1轴进行操作,也就是行。

我们来理一理这个逻辑吧~

创建一个三维数组,此时数组可以视作:

data=[[A,B,C],[D,E,F],[G,H,I] ]

其中, A A A 是一个行向量,表示 [ 1 , 2 , 3 ] [1,2,3] [1,2,3],这样,我们就从三维数组变成了二维数组(视觉上)。

来看看对axis=0的操作,此时我们做max(axis=0),理应从列出发,得到如下结果:
[ m a x ( A , D , G ) , m a x ( B , E , H ) , m a x ( C , F , I ) ] [max(A,D,G),max(B,E,H),max(C,F,I)] [max(A,D,G),max(B,E,H),max(C,F,I)]

好的确实如此。

axis=1的操作,应该就是:
[ m a x ( A , B , C ) , m a x ( D , E , F ) , m a x ( G , H , I ) ] [max(A,B,C),max(D,E,F),max(G,H,I)] [max(A,B,C),max(D,E,F),max(G,H,I)]

嗯,也确实是这个逻辑,只不过,二维情况下比较的是元素,高维比较的是向量。

那最后一个维度比的总得是元素了吧!此时做的工作类似于下面的逻辑:

res=[]
i in data.shape[0]:res.append(i.max(dim=1))

常用属性

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

示例

ndim

import numpy as npa=np.arange(24)
a.ndim # 1a=a.reshape(2,3,4)
a.ndim # 3

2️⃣ shape

a.shape # (2,3,4)

3️⃣ size

a.size # 24

4️⃣ dtype

a.dtype # dtype('int32')
a.dtype=np.float64
a.dtype # dtype('float64')

四、Numpy 创建数组

除却使用ndarray底层构造器外,我们还可以采用以下的方式来创建数组哦。

1️⃣ numpy.empty

参数说明

numpy.empty(shape, dtype = float, order = 'C')'''shape: 数组形状dtype: 数据类型order: 行优先还是列优先,表示在计算机内中存储元素的顺序
'''

创建一个空数组

x=np.empty([3,2],dtype=int)

数组的元素为随机数,因为并未进行初始化。

2️⃣ numpy.zeros

参数说明

numpy.zeros(shape, dtype = float, order = 'C')

创建一个零数组

# 默认浮点
x=np.zeros(5)
print(x) # [0. 0. 0. 0. 0.]# 设置类型为整数
y=np.zeros((5,),dtype=int)
print(y) # [0 0 0 0 0]# 自定义类型
z=np.zeros((2,2),dtype=[('x','i4'),('y','i4')])
print(z) 
'''
[[(0, 0) (0, 0)][(0, 0) (0, 0)]]
'''

3️⃣ numpy.ones(shape,dtype,order)

使用方式一样哦,创建全1数组

4️⃣ numpy.arange(start=0,stop,step,dtype)

返回一个0~n-1ndarray数组~

5️⃣ numpy.full(shape,val)

生成一个值全为val的数组~

6️⃣ numpy.eye(n)

生成单位矩阵~

7️⃣ numpy.diag(list)

生成对角线矩阵!


8️⃣ numpy.asarray(a,dtype,order)

从给定的参数中生成ndarray

9️⃣ numpy.fromiter(iterable,dtype,count=-1)

从可迭代对象中创建ndarray对象,返回一维数组,count表示读取的数据量,默认是读取所有数据

☀️ numpy.linspace

用于创建一个等差数列的一维数组

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
'''endpoint: 是否包含终止点retstep: 是否输出间距
'''
a=np.linspace(1,10,10)
print(a) # [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

🌙 numpy.logspace
用于创建一个等比数列

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
'''base: 默认底数num: 区间内生成指数个
'''
a=np.logspace(1,2,num=10)
print(a)[ 10.          12.91549665  16.68100537  21.5443469   27.8255940235.93813664  46.41588834  59.94842503  77.42636827 100.      ]
a=np.logspace(0,9,num=10,base=2)
print(a)# [  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]


五、Numpy的切片和索引

ndarray中的对象内容可以通过索引或切片来访问和修改。

有两种比较主流的索引方式:

  • 内置slice函数
  • 冒号分隔符

我们重点说冒号分隔符

A[star:step:end]

注意左闭右开

除却本身list的机制外,我们还可以采用省略号。

表示取到某一维度上的所有数据,譬如:

a=np.arange(1,10).reshape([3,3])
print(a)print(a[...,1]) # 第二列
print(a[1,...]) # 第二行
print(a[...,1:]) # 第二列开始的所有元素[[1 2 3][4 5 6][7 8 9]][2 5 8][4 5 6][[2 3][5 6][8 9]]

除此之外,Numpy有一些更高级的索引方式。

1️⃣整数数组索引

x=np.arange(1,7).reshape(3,2)
print(x)
y=x[[0,1,2,1],[0,1,0,0]]
print(y)[[1 2][3 4][5 6]][1 4 5 3]

根据数组维度,第一个索引数组表示axis=0,第二个索引数组表示axis=1,他们之间的一一映射确保了行列之间的取值。

维度不对会报错

当然,当第一个数组或者第二个数组维度为1时,不会报错,表示就要这一个位置。

2️⃣ 布尔索引

可以通过布尔运算来过滤指定条件之外的元素!

下面看个栗子:

x=np.arange(0,12).reshape(4,3)
print(x)
print(x[x>5]) # 找出大于5的元素[[ 0  1  2][ 3  4  5][ 6  7  8][ 9 10 11]][ 6  7  8  9 10 11]

下面的实例采用了逻辑非~NaN数据进行过滤

x=np.array([np.nan,1,2,np.nan,3,4,5])
print(x[~np.isnan(x)])[1. 2. 3. 4. 5.]

过滤非复数元素

a=np.array([1,2+6j,5,3.5+5j])
print(a[np.iscomplex(a)])[2. +6.j 3.5+5.j]

六、Numpy的广播机制

广播(Broadcast)是numpy对不同形状的数组进行数值计算的方式。

☀️

若两个数组ab形状相同,对应的操作应当是每个元素之间的操作。

这要求维数相同,且各维度的长度相同。

a=np.array([1,2,3,4])
b=np.array([10,20,30,40])
print(a*b)# [ 10  40  90 160]

🌙

在两个数组形状不同时,numpy将自动触发广播机制。

a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]
])
b=np.array([0,1,2])
print(a+b)[[ 0  1  2][10 11 12][20 21 22][30 31 32]]

其内部运算逻辑如下图:

这种广播要求的是一定有一个维度长度是匹配的,将较小的数组通过重复扩张到大的维度,以匹配维度为核心进行运算。

规则

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

简单理解

对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:

  • 数组拥有相同形状✅
  • 当前维度的值相等✅
  • 当前维度的值有一个是 1✅

1️⃣ 同shape

2️⃣ 某个维度相等

3️⃣ 某个维度为1

4️⃣ 不满足上述条件

弹出ValueError错误


七、Numpy 数组操作与逻辑运算

1️⃣ 逻辑运算

a=np.random.randint(0,20,10)
print(a[a>5])[ 7 11  8 13  7 16  7 19]
a=np.random.randint(0,20,10)
print(a[(a>5)|(a*2<10)])[10 18  8  1  4 16 13 18  1]

2️⃣ 通用判断函数

  • np.all()

    • 返回某个表达式中的元素是否全是满足条件

    • np.all(stock_day_rise[0:2,0:5] > 0)
      
  • np.unique()

    • 返回唯一值

    • np.unique(stock_day_rise[0:2,0:5].astype(int))
      
  • np.any()

    • 只要有一个元素满足条件就返回True

    • np.any(stock_day_rise[0:2,0:5] > 0)
      

3️⃣ 三元运算符

  • np.where(ndarray , A , B)

    • 如果满足条件,将元素替换为A,否则替换为B

    • np.where(temp > 0, 1, 0)
      
    • 常常结合np.logical_andnp.logical_or使用

    • np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
      np.where(np.logical_or(temp > 0.5, temp < -0.5), 1, 0)
      

数组操作
Numpy包含了一些函数用于处理数组,大致可分为以下几类:

  • 修改数组形状
  • 翻转数组
  • 修改数组维度
  • 连接数组
  • 分割数组
  • 数组元素的添加与删除

1️⃣ 修改数组形状

函数描述
reshape不改变数据的条件下修改形状
flat数组元素迭代器
flatten返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel返回展开数组

**numpy.reshape()**可以在不改变数据的条件下修改形状。

numpy.reshape(arr,newshape,order="C")

np.ndarray.flat是一个数组元素迭代器

for ele in a.flat:print(ele)

np.ndarray.flatten(order=“C”)返回一份展开(序列化)的数组拷贝,对其操作并不会改变原始数组

print ('展开的数组:')
print (a.flatten())
print ('\n')print ('以 F 风格顺序展开的数组:')
print (a.flatten(order = 'F'))'''
展开的数组:
[0 1 2 3 4 5 6 7]以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]'''

numpy.ravel返回展平的元素视图,对其操作会改变原始数组哦

a = np.arange(8).reshape(2,4)print ('原数组:')
print (a)
print ('\n')print ('调用 ravel 函数之后:')
print (a.ravel())
print ('\n')print ('以 F 风格顺序调用 ravel 函数之后:')
print (a.ravel(order = 'F'))'''
原数组:
[[0 1 2 3][4 5 6 7]]调用 ravel 函数之后:
[0 1 2 3 4 5 6 7]以 F 风格顺序调用 ravel 函数之后:
[0 4 1 5 2 6 3 7]
'''

2️⃣ 翻转数组

函数描述
transpose对换数组的维度
ndarray.Tself.transpose() 相同
rollaxis向后滚动指定的轴
swapaxes对换数组的两个轴

numpy.transpose

numpy.transpose 函数用于对换数组的维度,格式如下:

numpy.transpose(arr, axes)

参数说明:

  • arr:要操作的数组
  • axes:整数列表,对应维度,通常所有维度都会对换。

numpy.ndarray.T 类似 numpy.transpose,进行转置。


numpy.swapaxes

numpy.swapaxes 函数用于交换数组的两个轴,格式如下:

numpy.swapaxes(arr, axis1, axis2)
  • arr:输入的数组
  • axis1:对应第一个轴的整数
  • axis2:对应第二个轴的整数
# 创建了三维的 ndarray
a = np.arange(8).reshape(2,2,2)print ('原数组:')
print (a)
print ('\n')
# 现在交换轴 0(深度方向)到轴 2(宽度方向)print ('调用 swapaxes 函数后的数组:')
print (np.swapaxes(a, 2, 0))'''
原数组:
[[[0 1][2 3]][[4 5][6 7]]]调用 swapaxes 函数后的数组:
[[[0 4][2 6]][[1 5][3 7]]]
'''

3️⃣ 修改数组维度

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

numpy.expand_dims
numpy.expand_dims 函数通过在指定位置插入新的轴来扩展数组形状,函数格式如下:

 numpy.expand_dims(arr, axis)

参数说明:

  • arr:输入数组

  • axis:新轴插入的位置

x = np.array(([1,2],[3,4]))print ('数组 x:')
print (x)
print ('\n')
y = np.expand_dims(x, axis = 0)print ('数组 y:')
print (y)
print ('\n')print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)
print ('\n')
# 在位置 1 插入轴
y = np.expand_dims(x, axis = 1)print ('在位置 1 插入轴之后的数组 y:')
print (y)
print ('\n')print ('x.ndim 和 y.ndim:')
print (x.ndim,y.ndim)
print ('\n')print ('x.shape 和 y.shape:')
print (x.shape, y.shape)'''
数组 x:
[[1 2][3 4]]数组 y:
[[[1 2][3 4]]]数组 x 和 y 的形状:
(2, 2) (1, 2, 2)在位置 1 插入轴之后的数组 y:
[[[1 2]][[3 4]]]x.ndim 和 y.ndim:
2 3x.shape 和 y.shape:
(2, 2) (2, 1, 2)
'''

numpy.squeeze

numpy.squeeze 函数从给定数组的形状中删除一维的条目,函数格式如下:

numpy.squeeze(arr, axis)

参数说明:

  • arr:输入数组
  • axis:整数或整数元组,用于选择形状中一维条目的子集
import numpy as npx = np.arange(9).reshape(1,3,3)print ('数组 x:')
print (x)
print ('\n')
y = np.squeeze(x)print ('数组 y:')
print (y)
print ('\n')print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)'''
数组 x:
[[[0 1 2][3 4 5][6 7 8]]]数组 y:
[[0 1 2][3 4 5][6 7 8]]数组 x 和 y 的形状:
(1, 3, 3) (3, 3)
'''

连接数组

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

numpy.concatenate

numpy.concatenate 函数用于沿指定轴连接相同形状的两个或多个数组,格式如下:

numpy.concatenate((a1, a2, ...), axis)

参数说明:

  • a1, a2, ...:相同类型的数组
  • axis:沿着它连接数组的轴,默认为 0
import numpy as npa = np.array([[1,2],[3,4]])print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])print ('第二个数组:')
print (b)
print ('\n')
# 两个数组的维度相同print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('\n')print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))'''
第一个数组:
[[1 2][3 4]]第二个数组:
[[5 6][7 8]]沿轴 0 连接两个数组:
[[1 2][3 4][5 6][7 8]]沿轴 1 连接两个数组:
[[1 2 5 6][3 4 7 8]]
'''

numpy.stack

numpy.stack 函数用于沿新轴连接数组序列,格式如下:

numpy.stack(arrays, axis)

参数说明:

  • arrays相同形状的数组序列
  • axis:返回数组中的轴,输入数组沿着它来堆叠
import numpy as npa = np.array([[1,2],[3,4]])print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])print ('第二个数组:')
print (b)
print ('\n')print ('沿轴 0 堆叠两个数组:')
print (np.stack((a,b),0))
print ('\n')print ('沿轴 1 堆叠两个数组:')
print (np.stack((a,b),1))'''
第一个数组:
[[1 2][3 4]]第二个数组:
[[5 6][7 8]]沿轴 0 堆叠两个数组:
[[[1 2][3 4]][[5 6][7 8]]]沿轴 1 堆叠两个数组:
[[[1 2][5 6]][[3 4][7 8]]]
'''

numpy.hstack

numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。

import numpy as npa = np.array([[1,2],[3,4]])print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])print ('第二个数组:')
print (b)
print ('\n')print ('水平堆叠:')
c = np.hstack((a,b))
print (c)
print ('\n')'''
第一个数组:
[[1 2][3 4]]第二个数组:
[[5 6][7 8]]水平堆叠:
[[1 2 5 6][3 4 7 8]]
'''

numpy.vstack

numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。

import numpy as npa = np.array([[1,2],[3,4]])print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])print ('第二个数组:')
print (b)
print ('\n')print ('竖直堆叠:')
c = np.vstack((a,b))
print (c)'''
第一个数组:
[[1 2][3 4]]第二个数组:
[[5 6][7 8]]竖直堆叠:
[[1 2][3 4][5 6][7 8]]
'''

分割数组

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

numpy.split

numpy.split 函数沿特定的轴将数组分割为子数组,格式如下:

numpy.split(ary, indices_or_sections, axis)

参数说明:

  • ary:被分割的数组
  • indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
  • axis:设置沿着哪个方向进行切分,默认为 0,横向切分,即水平方向。为 1 时,纵向切分,即竖直方向。
import numpy as npa = np.arange(9)print ('第一个数组:')
print (a)
print ('\n')print ('将数组分为三个大小相等的子数组:')
b = np.split(a,3)
print (b)
print ('\n')print ('将数组在一维数组中表明的位置分割:')
b = np.split(a,[4,7])
print (b)'''
第一个数组:
[0 1 2 3 4 5 6 7 8]将数组分为三个大小相等的子数组:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]将数组在一维数组中表明的位置分割:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
'''

axis 为 0 时在水平方向分割,axis 为 1 时在垂直方向分割:

import numpy as npa = np.arange(16).reshape(4, 4)
print('第一个数组:')
print(a)
print('\n')
print('默认分割(0轴):')
b = np.split(a,2)
print(b)
print('\n')print('沿水平方向分割:')
c = np.split(a,2,1)
print(c)
print('\n')print('沿水平方向分割:')
d= np.hsplit(a,2)
print(d)'''
第一个数组:
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15]]默认分割(0轴):
[array([[0, 1, 2, 3],[4, 5, 6, 7]]), array([[ 8,  9, 10, 11],[12, 13, 14, 15]])]沿水平方向分割:
[array([[ 0,  1],[ 4,  5],[ 8,  9],[12, 13]]), array([[ 2,  3],[ 6,  7],[10, 11],[14, 15]])]沿水平方向分割:
[array([[ 0,  1],[ 4,  5],[ 8,  9],[12, 13]]), array([[ 2,  3],[ 6,  7],[10, 11],[14, 15]])]
'''

numpy.hsplit

numpy.hsplit 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组

import numpy as npharr = np.floor(10 * np.random.random((2, 6)))
print ('原array:')
print(harr)print ('拆分后:')
print(np.hsplit(harr, 3))'''
原array:
[[4. 7. 6. 3. 2. 6.][6. 3. 6. 7. 9. 7.]]
拆分后:
[array([[4., 7.],[6., 3.]]), array([[6., 3.],[6., 7.]]), array([[2., 6.],[9., 7.]])]
'''

numpy.vsplit

numpy.vsplit 沿着垂直轴分割,其分割方式与hsplit用法相同。

import numpy as npa = np.arange(16).reshape(4,4)print ('第一个数组:')
print (a)
print ('\n')print ('竖直分割:')
b = np.vsplit(a,2)
print (b)'''
第一个数组:
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11][12 13 14 15]]竖直分割:
[array([[0, 1, 2, 3],[4, 5, 6, 7]]), array([[ 8,  9, 10, 11],[12, 13, 14, 15]])]
'''

数组元素的添加与删除

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

numpy.resize
numpy.resize 函数返回指定大小的新数组。

如果新数组大小大于原始大小,则包含原始数组中的元素的副本。

numpy.resize(arr, shape)

参数说明:

  • arr:要修改大小的数组
  • shape:返回数组的新形状
import numpy as npa = np.array([[1,2,3],[4,5,6]])print ('第一个数组:')
print (a)
print ('\n')print ('第一个数组的形状:')
print (a.shape)
print ('\n')
b = np.resize(a, (3,2))print ('第二个数组:')
print (b)
print ('\n')print ('第二个数组的形状:')
print (b.shape)
print ('\n')
# 要注意 a 的第一行在 b 中重复出现,因为尺寸变大了print ('修改第二个数组的大小:')
b = np.resize(a,(3,3))
print (b)'''
第一个数组:
[[1 2 3][4 5 6]]第一个数组的形状:
(2, 3)第二个数组:
[[1 2][3 4][5 6]]第二个数组的形状:
(3, 2)修改第二个数组的大小:
[[1 2 3][4 5 6][1 2 3]]
'''

numpy.append

numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError。

append 函数返回的始终是一个一维数组。

numpy.append(arr, values, axis=None)

参数说明:

  • arr:输入数组
  • values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
  • axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
import numpy as npa = np.array([[1,2,3],[4,5,6]])print ('第一个数组:')
print (a)
print ('\n')print ('向数组添加元素:')
print (np.append(a, [7,8,9]))
print ('\n')print ('沿轴 0 添加元素:')
print (np.append(a, [[7,8,9]],axis = 0))
print ('\n')print ('沿轴 1 添加元素:')
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))'''
第一个数组:
[[1 2 3][4 5 6]]向数组添加元素:
[1 2 3 4 5 6 7 8 9]沿轴 0 添加元素:
[[1 2 3][4 5 6][7 8 9]]沿轴 1 添加元素:
[[1 2 3 5 5 5][4 5 6 7 8 9]]
'''

numpy.insert

numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值。

如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。

numpy.insert(arr, obj, values, axis)

参数说明:

  • arr:输入数组
  • obj:在其之前插入值的索引
  • values:要插入的值
  • axis:沿着它插入的轴,如果未提供,则输入数组会被展开
import numpy as npa = np.array([[1,2],[3,4],[5,6]])print ('第一个数组:')
print (a)
print ('\n')print ('未传递 Axis 参数。 在删除之前输入数组会被展开。')
print (np.insert(a,3,[11,12]))
print ('\n')
print ('传递了 Axis 参数。 会广播值数组来配输入数组。')print ('沿轴 0 广播:')
print (np.insert(a,1,[11],axis = 0))
print ('\n')print ('沿轴 1 广播:')
print (np.insert(a,1,11,axis = 1))'''
第一个数组:
[[1 2][3 4][5 6]]未传递 Axis 参数。 在删除之前输入数组会被展开。
[ 1  2  3 11 12  4  5  6]传递了 Axis 参数。 会广播值数组来配输入数组。
沿轴 0 广播:
[[ 1  2][11 11][ 3  4][ 5  6]]沿轴 1 广播:
[[ 1 11  2][ 3 11  4][ 5 11  6]]
'''

numpy.delete

numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开。

Numpy.delete(arr, obj, axis)

参数说明:

  • arr:输入数组
  • obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
import numpy as npa = np.arange(12).reshape(3,4)print ('第一个数组:')
print (a)
print ('\n')print ('未传递 Axis 参数。 在插入之前输入数组会被展开。')
print (np.delete(a,5))
print ('\n')print ('删除第二列:')
print (np.delete(a,1,axis = 1))
print ('\n')print ('包含从数组中删除的替代值的切片:')
a = np.array([1,2,3,4,5,6,7,8,9,10])
print (np.delete(a, np.s_[::2]))'''
第一个数组:
[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]未传递 Axis 参数。 在插入之前输入数组会被展开。
[ 0  1  2  3  4  6  7  8  9 10 11]删除第二列:
[[ 0  2  3][ 4  6  7][ 8 10 11]]包含从数组中删除的替代值的切片:
[ 2  4  6  8 10]
'''

numpy.unique

numpy.unique 函数用于去除数组中的重复元素。

numpy.unique(arr, return_index, return_inverse, return_counts)
  • arr:输入数组,如果不是一维数组则会展开
  • return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
  • return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
import numpy as npa = np.array([5,2,6,2,7,5,6,8,2,9])print ('第一个数组:')
print (a)
print ('\n')print ('第一个数组的去重值:')
u = np.unique(a)
print (u)
print ('\n')print ('去重数组的索引数组:')
u,indices = np.unique(a, return_index = True)
print (indices)
print ('\n')print ('我们可以看到每个和原数组下标对应的数值:')
print (a)
print ('\n')print ('去重数组的下标:')
u,indices = np.unique(a,return_inverse = True)
print (u)
print ('\n')print ('下标为:')
print (indices)
print ('\n')print ('使用下标重构原数组:')
print (u[indices])
print ('\n')print ('返回去重元素的重复数量:')
u,indices = np.unique(a,return_counts = True)
print (u)
print (indices)第一个数组:
[5 2 6 2 7 5 6 8 2 9]第一个数组的去重值:
[2 5 6 7 8 9]去重数组的索引数组:
[1 0 2 4 7 9]我们可以看到每个和原数组下标对应的数值:
[5 2 6 2 7 5 6 8 2 9]去重数组的下标:
[2 5 6 7 8 9]下标为:
[1 0 2 0 3 1 2 4 0 5]使用下标重构原数组:
[5 2 6 2 7 5 6 8 2 9]返回去重元素的重复数量:
[2 5 6 7 8 9]

八、位运算与字符串函数

函数描述
bitwise_and对数组元素执行位与操作
bitwise_or对数组元素执行位或操作
invert按位取反
left_shift向左移动二进制表示的位
right_shift向右移动二进制表示的位

举个简单的小栗子

import numpy as np print ('13 和 17 的二进制形式:')
a,b = 13,17
print (bin(a), bin(b))
print ('\n')print ('13 和 17 的位与:')
print (np.bitwise_and(13, 17))

字符串

函数描述
add()对两个数组的逐个字符串元素进行连接
multiply()返回按元素多重连接后的字符串
center()居中字符串
capitalize()将字符串第一个字母转换为大写
title()将字符串的每个单词的第一个字母转换为大写
lower()数组元素转换为小写
upper()数组元素转换为大写
split()指定分隔符对字符串进行分割,并返回数组列表
splitlines()返回元素中的行列表,以换行符分割
strip()移除元素开头或者结尾处的特定字符
join()通过指定分隔符来连接数组中的元素
replace()使用新字符串替换字符串中的所有子字符串
decode()数组元素依次调用str.decode
encode()数组元素依次调用str.encode

九、数学与统计函数

Numpy包含了大量的数学运算函数,包括三角函数,算数运算的函数,复数处理函数等。

我们介绍一些简单的函数。

三角函数

NumPy 提供了标准的三角函数:sin()、cos()、tan()。

import numpy as npa = np.array([0,30,45,60,90])
print ('不同角度的正弦值:')
# 通过乘 pi/180 转化为弧度  
print (np.sin(a*np.pi/180))
print ('\n')
print ('数组中角度的余弦值:')
print (np.cos(a*np.pi/180))
print ('\n')
print ('数组中角度的正切值:')
print (np.tan(a*np.pi/180))

arcsin,arccos,和 arctan 函数返回给定角度的 sin,cos 和 tan 的反三角函数。

这些函数的结果可以通过 numpy.degrees() 函数将弧度转换为角度。

import numpy as npa = np.array([0,30,45,60,90])  
print ('含有正弦值的数组:')
sin = np.sin(a*np.pi/180)  
print (sin)
print ('\n')
print ('计算角度的反正弦,返回值以弧度为单位:')
inv = np.arcsin(sin)  
print (inv)
print ('\n')
print ('通过转化为角度制来检查结果:')
print (np.degrees(inv))
print ('\n')
print ('arccos 和 arctan 函数行为类似:')
cos = np.cos(a*np.pi/180)  
print (cos)
print ('\n')
print ('反余弦:')
inv = np.arccos(cos)  
print (inv)
print ('\n')
print ('角度制单位:')
print (np.degrees(inv))
print ('\n')
print ('tan 函数:')
tan = np.tan(a*np.pi/180)  
print (tan)
print ('\n')
print ('反正切:')
inv = np.arctan(tan)  
print (inv)
print ('\n')
print ('角度制单位:')
print (np.degrees(inv))'''
含有正弦值的数组:
[0.         0.5        0.70710678 0.8660254  1.        ]计算角度的反正弦,返回值以弧度为单位:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]通过转化为角度制来检查结果:
[ 0. 30. 45. 60. 90.]arccos 和 arctan 函数行为类似:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-016.12323400e-17]反余弦:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]角度制单位:
[ 0. 30. 45. 60. 90.]tan 函数:
[0.00000000e+00 5.77350269e-01 1.00000000e+00 1.73205081e+001.63312394e+16]反正切:
[0.         0.52359878 0.78539816 1.04719755 1.57079633]角度制单位:
[ 0. 30. 45. 60. 90.]
'''

舍入函数

numpy.around() # 函数返回指定数字的四舍五入值。
numpy.floor() # 返回小于或者等于指定表达式的最大整数,即向下取整。
numpy.ceil() # 返回大于或者等于指定表达式的最小整数,即向上取整。

算术函数

NumPy 算术函数包含简单的加减乘除: add()subtract()multiply()divide()

需要注意的是数组必须具有相同的形状或符合数组广播规则。

栗子

import numpy as np a = np.arange(9, dtype = np.float_).reshape(3,3)  
print ('第一个数组:')
print (a)
print ('\n')
print ('第二个数组:')
b = np.array([10,10,10])  
print (b)
print ('\n')
print ('两个数组相加:')
print (np.add(a,b))
print ('\n')
print ('两个数组相减:')
print (np.subtract(a,b))
print ('\n')
print ('两个数组相乘:')
print (np.multiply(a,b))
print ('\n')
print ('两个数组相除:')
print (np.divide(a,b))'''
第一个数组:
[[0. 1. 2.][3. 4. 5.][6. 7. 8.]]第二个数组:
[10 10 10]两个数组相加:
[[10. 11. 12.][13. 14. 15.][16. 17. 18.]]两个数组相减:
[[-10.  -9.  -8.][ -7.  -6.  -5.][ -4.  -3.  -2.]]两个数组相乘:
[[ 0. 10. 20.][30. 40. 50.][60. 70. 80.]]两个数组相除:
[[0.  0.1 0.2][0.3 0.4 0.5][0.6 0.7 0.8]]
'''

除此之外,Numpy也包含了其他重要的算术函数。

reciprocal()

numpy.reciprocal() # 函数返回参数逐元素的倒数。如 1/4 倒数为 4/1。

栗子

import numpy as np a = np.array([0.25,  1.33,  1,  100])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 reciprocal 函数:')
print (np.reciprocal(a))'''
我们的数组是:
[  0.25   1.33   1.   100.  ]调用 reciprocal 函数:
[4.        0.7518797 1.        0.01     ]
'''

power()

numpy.power() # 函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。

栗子

import numpy as np a = np.array([10,100,1000])  
print ('我们的数组是;')
print (a)
print ('\n') 
print ('调用 power 函数:')
print (np.power(a,2))
print ('\n')
print ('第二个数组:')
b = np.array([1,2,3])  
print (b)
print ('\n')
print ('再次调用 power 函数:')
print (np.power(a,b))'''
我们的数组是;
[  10  100 1000]调用 power 函数:
[    100   10000 1000000]第二个数组:
[1 2 3]再次调用 power 函数:
[        10      10000 1000000000]
'''

mod()

numpy.mod() # 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果

来看个栗子

我们的数组是;
[  10  100 1000]调用 power 函数:
[    100   10000 1000000]第二个数组:
[1 2 3]再次调用 power 函数:
[        10      10000 1000000000]import numpy as npa = np.array([10,20,30]) 
b = np.array([3,5,7])  
print ('第一个数组:')
print (a)
print ('\n')
print ('第二个数组:')
print (b)
print ('\n')
print ('调用 mod() 函数:')
print (np.mod(a,b))
print ('\n')
print ('调用 remainder() 函数:')
print (np.remainder(a,b))'''
第一个数组:
[10 20 30]第二个数组:
[3 5 7]调用 mod() 函数:
[1 0 2]调用 remainder() 函数:
[1 0 2]
'''

统计函数

numpy.amin() 和 numpy.amax()

  • numpy.amin() 用于计算数组中的元素沿指定轴的最小值。
  • numpy.amax() 用于计算数组中的元素沿指定轴的最大值。

栗子

import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 amin() 函数:')
print (np.amin(a,1))
print ('\n')
print ('再次调用 amin() 函数:')
print (np.amin(a,0))
print ('\n')
print ('调用 amax() 函数:')
print (np.amax(a))
print ('\n')
print ('再次调用 amax() 函数:')
print (np.amax(a, axis =  0))'''
我们的数组是:
[[3 7 5][8 4 3][2 4 9]]调用 amin() 函数:
[3 3 2]再次调用 amin() 函数:
[2 4 3]调用 amax() 函数:
9再次调用 amax() 函数:
[8 7 9]
'''

numpy.ptp()

numpy.ptp()函数计算数组中元素最大值与最小值的差(最大值 - 最小值)

栗子!

import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 ptp() 函数:')
print (np.ptp(a))
print ('\n')
print ('沿轴 1 调用 ptp() 函数:')
print (np.ptp(a, axis =  1))
print ('\n')
print ('沿轴 0 调用 ptp() 函数:')
print (np.ptp(a, axis =  0))'''
我们的数组是:
[[3 7 5][8 4 3][2 4 9]]调用 ptp() 函数:
7沿轴 1 调用 ptp() 函数:
[4 5 7]沿轴 0 调用 ptp() 函数:
[6 3 6]
'''

numpy.percentile()

百分位数是统计中使用的度量,表示小于这个值的观察值的百分比。 函数numpy.percentile()接受以下参数。

numpy.percentile(a, q, axis)

看个栗子

import numpy as np a = np.array([[10, 7, 4], [3, 2, 1]])
print ('我们的数组是:')
print (a)print ('调用 percentile() 函数:')
# 50% 的分位数,就是 a 里排序之后的中位数
print (np.percentile(a, 50)) # axis 为 0,在纵列上求
print (np.percentile(a, 50, axis=0)) # axis 为 1,在横行上求
print (np.percentile(a, 50, axis=1)) # 保持维度不变
print (np.percentile(a, 50, axis=1, keepdims=True))'''
我们的数组是:
[[10  7  4][ 3  2  1]]
调用 percentile() 函数:
3.5
[6.5 4.5 2.5]
[7. 2.]
[[7.][2.]]'''

numpy.median()

numpy.median() 函数用于计算数组 a 中元素的中位数(中值)

栗子

import numpy as np a = np.array([[30,65,70],[80,95,10],[50,90,60]])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 median() 函数:')
print (np.median(a))
print ('\n')
print ('沿轴 0 调用 median() 函数:')
print (np.median(a, axis =  0))
print ('\n')
print ('沿轴 1 调用 median() 函数:')
print (np.median(a, axis =  1))'''
我们的数组是:
[[30 65 70][80 95 10][50 90 60]]调用 median() 函数:
65.0沿轴 0 调用 median() 函数:
[50. 90. 60.]沿轴 1 调用 median() 函数:
[65. 80. 60.]
'''

numpy.mean()

numpy.mean() 函数返回数组中元素的算术平均值。 如果提供了轴,则沿其计算。

算术平均值是沿轴的元素的总和除以元素的数量。

看个栗子

import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 mean() 函数:')
print (np.mean(a))
print ('\n')
print ('沿轴 0 调用 mean() 函数:')
print (np.mean(a, axis =  0))
print ('\n')
print ('沿轴 1 调用 mean() 函数:')
print (np.mean(a, axis =  1))'''
我们的数组是:
[[1 2 3][3 4 5][4 5 6]]调用 mean() 函数:
3.6666666666666665沿轴 0 调用 mean() 函数:
[2.66666667 3.66666667 4.66666667]沿轴 1 调用 mean() 函数:
[2. 4. 5.]
'''

numpy.average()

numpy.average() 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。

该函数可以接受一个轴参数。 如果没有指定轴,则数组会被展开。

加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。

考虑数组[1,2,3,4]和相应的权重[4,3,2,1],通过将相应元素的乘积相加,并将和除以权重的和,来计算加权平均值。

栗子

import numpy as np a = np.array([1,2,3,4])  
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 average() 函数:')
print (np.average(a))
print ('\n')
# 不指定权重时相当于 mean 函数
wts = np.array([4,3,2,1])  
print ('再次调用 average() 函数:')
print (np.average(a,weights = wts))
print ('\n')
# 如果 returned 参数设为 true,则返回权重的和  
print ('权重的和:')
print (np.average([1,2,3,  4],weights =  [4,3,2,1], returned =  True))'''
我们的数组是:
[1 2 3 4]调用 average() 函数:
2.5再次调用 average() 函数:
2.0权重的和:
(2.0, 10.0)
'''

在多维数组中,可以指定用于计算的轴。

import numpy as np a = np.arange(6).reshape(3,2)  
print ('我们的数组是:')
print (a)
print ('\n')
print ('修改后的数组:')
wt = np.array([3,5])  
print (np.average(a, axis =  1, weights = wt))
print ('\n')
print ('修改后的数组:')
print (np.average(a, axis =  1, weights = wt, returned =  True))'''
我们的数组是:
[[0 1][2 3][4 5]]修改后的数组:
[0.625 2.625 4.625]修改后的数组:
(array([0.625, 2.625, 4.625]), array([8., 8., 8.]))
'''

方差与标准差

标准差是一组数据平均值分散程度的一种度量。

标准差是方差的算术平方根。

import numpy as np print (np.std([1,2,3,4]))# 1.1180339887498949print (np.var([1,2,3,4]))# 1.25

十、矩阵与线性代数

Numpy中包含了一个矩阵库numpy.matlib,该模块返回的是一个矩阵,而不是ndarray对象。

转置

import numpy as npa = np.arange(12).reshape(3,4)print ('原数组:')
print (a)
print ('\n')print ('转置数组:')
print (a.T)

空矩阵

numpy.matlib.empty(shape, dtype, order)

全1矩阵

np.matlib.ones()

全0矩阵

np.matlib.zeros()

单位矩阵

numpy.matlib.eye(n, M,k, dtype)

主对角线矩阵

np.matlib.identity(5, dtype =  float)

随机矩阵

np.matlib.rand(3,3)

在二维情况下,ndarraymatrix可以进行互换

np.matrix('1,2;3,4')# 转化为ndarray
np.asarray(i)# 转化为矩阵
np.asmatrix(j)

线性代数函数

函数描述
dot两个数组的点积,即元素对应相乘。
vdot两个向量的点积
inner两个数组的内积
matmul两个数组的矩阵积
determinant数组的行列式
solve求解线性矩阵方程
inv计算矩阵的乘法逆矩阵
matrix_power升幂
qrqr分解,q是一个正交矩阵,rupper-triangular
matrix_tank通过SVD方法返回数组的矩阵秩

numpy.linalg.det()

计算输入矩阵的行列式

栗子

import numpy as npb = np.array([[6,1,1], [4, -2, 5], [2,8,7]]) 
print (b)
print (np.linalg.det(b))
print (6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2))

numpy.linalg.solve()

求解方程结果

栗子

# 求解方程组x0+2*x1=1
# 3*x0+5*x1=2
a = np.array([[1, 2], [3, 5]])
b = np.array([1, 2])
x = np.linalg.solve(a, b)array([-1,1])

numpy.linalg.inv()

计算乘法逆矩阵

栗子

import numpy as np a = np.array([[1,1,1],[0,2,5],[2,5,-1]]) print ('数组 a:')
print (a)
ainv = np.linalg.inv(a) print ('a 的逆:')
print (ainv)print ('矩阵 b:')
b = np.array([[6],[-4],[27]]) 
print (b)print ('计算:A^(-1)B:')
x = np.linalg.solve(a,b) 
print (x)
# 这就是线性方向 x = 5, y = 3, z = -2 的解

十一、IO

Numpy可以读写磁盘上的二进制或者文本文件。

其文件格式为npy,女朋友文件可以重建ndarray的数据、图像和其他info

常见的IO函数

numpy.save(file,arr,allow_pickle=True,fix_imports=True)
'''
+ file: 要保存的文件,扩展名为.npy
+ arr: 要保存的数组
+ allow_pickle: 允许Python pickles保存对象数组,这玩意会对对象进行序列化和反序列化
+ fix_imports: 主要方便PY3文件向下兼容PY2
'''

栗子

import numpy as np
a=np.array([1,2,3,4,5])
np.save('output.npy',a)
# 输出的文件是乱码的,属于加密文件
# 通过load读取就行b=np.load("output.npy")
numpy.savez(file,*args,**kwds)
'''
+ file: 要保存的文件,后缀是npz
+ args: 要保存的数组,可以通过k-v形式可以设定一个名字,否则default arr_0
+ kwds: 要保存的数组使用关键字名字
'''

栗子

a = np.array([[1,2,3],[4,5,6]])
b = np.arange(0, 1.0, 0.1)
c = np.sin(b)# C使用了关键字参数
np.savez("runoob.npz",a,b,sin_array=c)r=np.load("runoob.npz")
a=r["arr_0"]
b=r["arr_1"]
c=r["sin_array"]

前面捏是存储二进制文件,那对于文本,也可以通过savetxt()loadtxt()进行操作哦。

np.loadtxt(filename,dtype=int,delimiter='')
np.savetxt(filename,a,fmt="%d",delimiter=",")

栗子

a=np.arange(0,10,0.5).reshape(4,-1)
# 保留整数,用逗号作为分隔符
np.savetxt("out.txt",a,fmt="%d"mdelimiter=",")
# 读取数据,也需要指定逗号分隔符
b=np.loadtxt("out.txt",delimiter=",")

十二、随机模块

1️⃣ 均匀分布

  • np.random.rand(dim)
    • 返回[0,1)区间内均匀分布的数
  • np.random.uniform(low=0.0,high=1.0,size=None)
    • 在均匀分布区间[low,high)中随机采样
  • np.random,randint(low,high,size,dtype=“I”)
    • 返回随机整数

2️⃣ 正态分布

公式
f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{\frac{-(x-\mu)^2}{2\sigma^2}} f(x)=σ2π 1e2σ2(xμ)2

  • np.random.randn(dim)
    • 从标准正态分布返回一个或多个样本值
  • np.random.normal(loc=0.0,scale=1.0,size=None)
    • 均值,方差,形状

**案例 ** 随机生成8只股票10天的交易日涨幅数据

stock_change=np.random.normal(0,1,(8,10))'''
return : np.ndarray
'''

np.newaxis

np.newaxis 的功能是增加新的维度,但是要注意 np.newaxis 放的位置不同,产生的矩阵形状也不同。

通常按照如下规则:

np.newaxis 放在哪个位置,就会给哪个位置增加维度

x[:, np.newaxis] ,放在后面,会给列上增加维度
x[np.newaxis, :] ,放在前面,会给行上增加维度

用途: 通常用它将一维的数据转换成一个矩阵,这样就可以与其他矩阵进行相乘。


http://chatgpt.dhexx.cn/article/iqJ0tZnM.shtml

相关文章

Python之Numpy详细教程

NumPy - 简介 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。…

Java泛型方法的定义和使用

目录 一、基本介绍1、Java泛型的基本语法格式为:2、在使用泛型时,还需要注意以下几点:二、泛型的优点1、类型安全2、消除强制类型转换3、更高的效率4、潜在的性能收益三、常见泛型字母含义四、使用泛型时的注意事项五、泛型的使用1、泛型类2、泛型接口3、泛型通配符4、泛型方…

java参数传入泛型类型_java泛型方法参数传递

Java参数&#xff0c;不管是原始类型还是引用类型&#xff0c;传递的都是副本(有另外一种说法是传值&#xff0c;但是说传副本更好理解吧&#xff0c;传值通常是相对传址而言)。 如果参数类型是原始类型&#xff0c;那么传过来的就是这个参数的一个副本&#xff0c;也就是这个…

Java 泛型作为方法参数

Java 泛型作为方法参数 例程源码&#xff1a; import java.util.List;public class GoodsSeller {public void sellGoods(List<? extends Goods> goods){//调用集合中的sell方法for(Goods g:goods){g.sell();}} }public class Book extends Goods {Overridepublic void …

49天精通Java,第32天,Java泛型方法的定义和使用

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于Java基础教程(入门篇),包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识…

java泛型 方法返回值带有泛型 <T>

方法返回值前的<T>的左右是告诉编译器&#xff0c;当前的方法的值传入类型可以和类初始化的泛型类不同&#xff0c;也就是该方法的泛型类可以自定义&#xff0c;不需要跟类初始化的泛型类相同。 转自&#xff1a;https://blog.csdn.net/huyashangding/article/details/9…

Java 泛型方法/接口、泛型限定

文章目录一、为什么要定义泛型方法1、从泛型类到泛型方法的演变过程2、定义泛型方法的好处二、创建一个泛型方法格式常用的形式三、泛型接口1、格式2、例子四、类型通配符(泛型的高级应用)1、什么是通配符 (?)2、类型通配符上限定(? extends T >可以接收T类型或者T的子类型…

Java 泛型方法

本文包含&#xff1a; 定义泛型方法泛型方法和类型通配符的区别Java 7 的“菱形”语法与泛型构造器设定通配符下限泛型方法与方法重载Java 8 改进的类型推断 1. 定义泛型方法 假设需要实现这样一个方法&#xff1a;该方法负责将一个 Object 数组的所有元素添加到一个 Collec…

【java】泛型方法的定义

一、定义泛型方法的格式 二、调用泛型方法的语法格式 三、解释 1、定义泛型方法时&#xff0c;必须在返回值前边加一个<T>&#xff0c;来声明这是一个泛型方法&#xff0c;持有一个泛型T&#xff0c;然后才可以用泛型T作为方法的返回值。 2、Class<T>的作用就是指…

Java 中的泛型(两万字超全详解)

文章目录 前言一、泛型概述1. 什么是泛型&#xff1f;为什么要使用泛型&#xff1f;2. 泛型使用场景3. 泛型概述小结 二、泛型类1. 泛型类的定义2. 泛型类的使用 三、泛型接口四、泛型方法1. 泛型方法的定义2. 泛型方法的使用3. 泛型方法中的类型推断 五、类型擦除1. 什么是类型…

Java中的泛型方法

泛型是什么意思在这就不多说了&#xff0c;而Java中泛型类的定义也比较简单&#xff0c;例如&#xff1a;public class Test{}。这样就定义了一个泛型类Test&#xff0c;在实例化该类时&#xff0c;必须指明泛型T的具体类型&#xff0c;例如&#xff1a;Test t new Test();&am…

【软件测试】使用C++ Test进行动态测试

测试目的 1.掌握动态测试的方法。 2.掌握使用Parasoft C Test进行动态测试。 测试环境 Windows XP, Parasoft C Test 9.2 测试内容 使用Parasoft C Test进行动态测试&#xff0c;包括自动化测试、自定义测试用例、数据源测试用例、桩函数机制。 测试过程及结果 4.1 基于…

测试基础-动态白盒测试

1.动态白盒测试 定义&#xff1a;也称结构化测试。利用查看代码功能&#xff08;作什么&#xff09;和实现方式&#xff08;怎么做&#xff09;得到的信息来确定哪些需要测试、哪些不需要测试、如何开展测试。 动态白盒测试包括以下4个部分&#xff1a; 直接测试底层函数、过…

符合功能安全要求的动态测试工具-TESSY

Tessy是一个专门针对嵌入式软件的C/C代码进行单元、集成测试的工具&#xff0c;它可以自动化地执行测试、评估测试结果并生成测试报告。 Tessy的目标就是&#xff1a;通过自动化整个测试周期&#xff0c;支持针对C语言的单元测试/集成测试&#xff0c;同时&#xff0c;Tessy也…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖 符号测试错…

动态测试

动态测试 1.1 动态分析技术 虽然静态分析技术不需要软件的执行&#xff0c;而从动态分析本身来看更像是一个“测试”。它包含了系统的执行。当软件系统在模拟的或真实的环境中执行之前、之中和之后&#xff0c;对软件系统行为的分析是动态分析的主要特点。动态分析包含了程序在…

软件测试复习04:动态测试——黑盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 等价划分法边值分析法错误推测法因果图法示例 习题 等价划分法 等价类&#xff1a;一个几何&…

动态测试方法

动态测试方法&#xff0c;通过实际执行代码去发现潜在代码错误的测试方法。 人工动态方法 人工动态方法&#xff0c;可以真正检测代码的业务逻辑功能&#xff0c;其关注点是“什么样的输入&#xff0c;执行了什么代码&#xff0c;产生了什么样的输出”&#xff0c;主要用于发…

linux同步时间服务器时间配置

linux时间同步简单配置如下(centos7.x)&#xff1a; 安装时间服务器(系统一般会自带)&#xff1a; yum install ntp ntpdate -y 时间服务器临时配置(重启该配置失效)&#xff1a; ntpdate 192.133.203.89(时间服务器ip) 时间服务器配置: vim /etc/chrony.conf 进入vim编辑页面…

linux 多台机器修改时间同步

修改东八区 首先第一步&#xff0c;通过命令 &#xff1a;date -R 查看当前系统所在时区。如是0800&#xff0c;则是东八区&#xff0c;也就是我们当下的北京时间&#xff0c;如不是&#xff08;如下图&#xff09;&#xff0c;做如下调整。 命令行键入命令&#xff1a;tzsele…