#导入库
import numpy as np
#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
Numpy 中最重要的一个对象就是 ndarray。
ndarray中的每个元素在内存中使用相同大小的块(即只包含同一类型的数据)。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)。
np.array([0,1,3.14,5])
array([0. , 1. , 3.14, 5. ])
np.array([1.0,2,4,'b'])
array(['1.0', '2', '4', 'b'], dtype='<U32')
#设置数组的数据类型,可以设置dtype关键字
np.array([3.14, 4, 2, 3] , dtype='int32')
array([3, 4, 2, 3])
# 生成开始为 1,结束为 5(6-1),步长为 2 数组
np.arange(1, 6, 2)
array([1, 3, 5])
# 创建一个5个元素的数组, 5个数均匀的分配到我们设置的空间(0到9)内
np.linspace(0, 9, 5, dtype="int32")
array([0, 2, 4, 6, 9])
a = [1,2,3,4]
np.random.shuffle(a) #随机打乱序列
a
[4, 3, 1, 2]
创建特殊矩阵
np.zeros(3) #float型
np.zeros([3,3],dtype='int32')
array([0., 0., 0.])
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.empty(10)
array([9.72415862e-312, 2.12448228e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000, 1.16095484e-028, 7.52736939e+252, 4.50603893e-144,
4.82412328e+228, 1.04718130e-142])
np.diag(np.array([1, 2, 3, 4]))
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
np.full((3, 5),3.14 )
array([[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14]])
np.random.random((2, 3)) # 均匀分布 在 [0.0,1.0)的随机浮点数,不填参数默认返回一个数
array([[0.65552214, 0.21596413, 0.23333457],
[0.580594 , 0.88772174, 0.81692953]])
np.random.rand(2, 3) # uniform in [0, 1]
array([[0.65388409, 0.64801035, 0.70011238],
[0.01156336, 0.99604292, 0.05463308]])
np.random.randn(2, 3) # Gaussian # 标准正态分布
array([[-0.40782852, -1.05558831, -0.75859804],
[ 0.47699373, -0.4187616 , -1.11787263]])
# 设置随机数种子, 拆开发现不好使, 必须放在一起才好使
np.random.seed(1) #种子一样产生的随机数也一样
np.random.randn(2, 3)
array([[ 1.62434536, -0.61175641, -0.52817175],
[-1.07296862, 0.86540763, -2.3015387 ]])
np.random.randint(1,9, (3, 3)) #或者用size=(3,3)
array([[7, 6, 3],
[5, 4, 5],
[3, 5, 6]])
np.random.normal(0, 1, (4, 3)) # 均值, 标准差, 形状
array([[ 0.85817886, 0.07134299, -2.29230928],
[-1.41555249, 0.8858294 , 0.63190187],
[ 0.04026035, -0.90312288, 0.17532267],
[ 0.19443089, -0.53524902, 0.77735121]])
查看数组的属性
nddaray常用属性 | |
---|---|
ndarray.flags | 有关数组的内存布局的信息。 |
ndarray.shape | 数组维数组。 |
ndarray.ndim | 数组维数,在Python世界中,维度的数量被称为rank。 |
ndarray.data | Python缓冲区对象指向数组的数据的开始。 |
ndarray.size | 数组中的元素总个数。 |
ndarray.itemsize | 一个数组元素的长度(以字节为单位)。 |
ndarray.dtype | 数组元素的数据类型。 |
ndarray.T | 数组的转置。 |
arr = np.eye(3)
arr.shape
(3, 3)
arr.ndim
2
arr.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
## 转换数组的类型
#使用.astype()方法(首选)或类型本身作为函数。
arr.astype(np.bool_)
array([[ True, False, False],
[False, True, False],
[False, False, True]])
arr
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.bool_(arr)
array([[ True, False, False],
[False, True, False],
[False, False, True]])
切片·索引·视图·副本
关于数组切片有一点很重要也非常有用,那就是数组切片返回的是
数组数据的视图,而不是数值数据的副本。这一点也是 NumPy 数
组切片和 Python 列表切片的不同之处:在 Python 列表中,切片是
值的副本。
arr1 = arr[1,:]
arr1
arr1[0] = 3
arr1
arr
array([0., 1., 0.])
array([3., 1., 0.])
array([[1., 0., 0.],
[3., 1., 0.],
[0., 0., 1.]])
#注意
arr1 = [2,2,2]
arr1
arr
[2, 2, 2]
array([[1., 0., 0.],
[3., 1., 0.],
[0., 0., 1.]])
可以通过.copy()方法创建一个副本
数组的变形
数组变形最灵活的实现方式是通 过 reshape() 函数来实现。
如果希望该方法可行,那么原始数组的大小必须和变形后数组 的大小一致。如果满足这个条件,reshape 方法将会用到原始数组的一 个视图。
arr.reshape(1,9)
array([[1., 0., 0., 3., 1., 0., 0., 0., 1.]])
小技巧
技巧:在使用 reshape 时,可以将其中的一个维度指定为 -1,Numpy 会自动计算出它的真实值
arr.reshape(1,-1)
array([[1., 0., 0., 3., 1., 0., 0., 0., 1.]])
arr.ravel() # 进行平铺
array([1., 0., 0., 3., 1., 0., 0., 0., 1.])
arr.T #转置
array([[1., 3., 0.],
[0., 1., 0.],
[0., 0., 1.]])
无论是ravel、reshape、T,它们都不会更改原有的数组形状,都是返回一个新的数组。
使用 resize 方法可以直接修改数组本身:
arr.resize(1,9)
arr
array([[1., 0., 0., 3., 1., 0., 0., 0., 1.]])
数组的拼接
拼接或连接 NumPy 中的两个数组主要由
np.concatenate、np.vstack 和 np.hstack 实现
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
z = np.concatenate([x, y])
z
#np.concatenate([x, y],axis=1) 只有一个维度,会报错
array([1, 2, 3, 3, 2, 1])
z.resize(2,3)
np.concatenate([z,z],axis=0)
np.concatenate([z,z],axis=1)
array([[1, 2, 3],
[3, 2, 1],
[1, 2, 3],
[3, 2, 1]])
array([[1, 2, 3, 1, 2, 3],
[3, 2, 1, 3, 2, 1]])
np.vstack([z,z])
np.hstack([z,z])
array([[1, 2, 3],
[3, 2, 1],
[1, 2, 3],
[3, 2, 1]])
array([[1, 2, 3, 1, 2, 3],
[3, 2, 1, 3, 2, 1]])
数据的分裂
将一个数组分成几个较小的数组
既然可以将多个数组进行对堆叠,自然也可以将一个数组拆分成多个小数组。
使用hsplit,可以沿其水平轴拆分数组,通过指定要返回的均匀划分的数组数量,或通过指定要在其后进行划分的列:
np.hsplit(z,3) #按列分割,保持行数不变
[array([[1],
[3]]), array([[2],
[2]]), array([[3],
[1]])]
np.vsplit(z,2) #按行分割,保持列数不变
[array([[1, 2, 3]]), array([[3, 2, 1]])]
Numpy的常用数学函数
数学运算函数 | |
---|---|
add(x1,x2 [,out]) | 按元素添加参数,等效于 x1 + x2 |
subtract(x1,x2 [,out]) | 按元素方式减去参数,等效于x1 - x2 |
multiply(x1,x2 [,out]) | 逐元素乘法参数,等效于x1 * x2 |
divide(x1,x2 [,out]) | 逐元素除以参数,等效于x1 / x2 |
exp(x [,out]) | 计算输入数组中所有元素的指数。 |
exp2(x [,out]) | 对于输入数组中的所有p,计算2 * p*。 |
log(x [,out]) | 自然对数,逐元素。 |
log2(x [,out]) | x的基础2对数。 |
log10(x [,out]) | 以元素为单位返回输入数组的基数10的对数。 |
expm1(x [,out]) | 对数组中的所有元素计算exp(x) - 1 |
log1p(x [,out]) | 返回一个加自然对数的输入数组,元素。 |
sqrt(x [,out]) | 按元素方式返回数组的正平方根。 |
square(x [,out]) | 返回输入的元素平方。 |
sin(x [,out]) | 三角正弦。 |
cos(x [,out]) | 元素余弦。 |
tan(x [,out]) | 逐元素计算切线。 |
规约函数
下面所有的函数都支持axis来指定不同的轴,用法都是类似的。
ndarray.sum([axis,dtype,out,keepdims]) | 返回给定轴上的数组元素的总和。 |
---|---|
ndarray.cumsum([axis,dtype,out]) | 返回沿给定轴的元素的累积和。 |
ndarray.mean([axis,dtype,out,keepdims]) | 返回沿给定轴的数组元素的平均值。 |
ndarray.var([axis,dtype,out,ddof,keepdims]) | 沿给定轴返回数组元素的方差。 |
ndarray.std([axis,dtype,out,ddof,keepdims]) | 返回给定轴上的数组元素的标准偏差。 |
ndarray.argmax([axis,out]) | 沿着给定轴的最大值的返回索引。 |
ndarray.min([axis,out,keepdims]) | 沿给定轴返回最小值。 |
ndarray.argmin([axis,out]) | 沿着给定轴的最小值的返回索引。 |