Python数据分析之numpy

#导入库
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]) 沿着给定轴的最小值的返回索引。
posted @ 2018-07-23 11:23  bm小明  阅读(218)  评论(0编辑  收藏  举报