程序员Python语言与信息数据获取和机器学习我爱编程

Numpy基础

2017-08-12  本文已影响134人  MakerChen

简单介绍

NumPy(Numerical Python)是高性能科学计算和数据分析的基础包。

由于NumPy提供了一个简单易用的C API,因此很容易将数据传递给由低级语言编写的外部库,外部库也能以NumPy数组的形式将数据返回给Python。

ndarray:一种多维数组对象

通用的同构数据多维容器,即所有元素必须是相同类型的。
每个数组都有一个shape(各维度大小的元组)和一个dtype(用于说明数据类型的对象)

创建ndarray

import numpy as np

data1 = [6,7.5,8,0,1]
arr1=np.array(data1)

arr1
array([ 6. ,  7.5,  8. ,  0. ,  1. ])
data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)

arr2,arr2.shape
(array([[1, 2, 3, 4],
        [5, 6, 7, 8]]), (2, 4))
np.zeros(10,dtype='int32')
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
np.ones((3,6),dtype='int32')
array([[1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1]], dtype=int32)
np.empty((5,2,3))
array([[[  0.00000000e+000,   0.00000000e+000,   7.41098469e-323],
        [  0.00000000e+000,   0.00000000e+000,   0.00000000e+000]],

       [[  0.00000000e+000,   0.00000000e+000,   0.00000000e+000],
        [  0.00000000e+000,   0.00000000e+000,   0.00000000e+000]],

       [[  0.00000000e+000,   1.27319747e-313,   1.34582706e-315],
        [  0.00000000e+000,   3.39519327e-313,   4.44659081e-323]],

       [[  2.54639495e-313,   6.42285340e-323,   3.39558181e-313],
        [  2.20059502e-314,   0.00000000e+000,   0.00000000e+000]],

       [[  2.12345285e-314,   1.87109396e-308,   2.12409004e-314],
        [  2.12408964e-314,   2.12408996e-314,   2.08600887e-308]]])
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.eye(4)
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

ndarray的数据类型

数值型dtype的命名方式相同:一个类型名(如float、int),后面跟一个用于表示各元素位长的数字。

类型 类型代码 说明
int8(16,32,64),uint8(16,32,64) i1(2,4,8),u1(2,4,8) 有符号和无符号的8(16,32,64)位(1,2,3,4个字节)整型
float16 f2 半精度浮点数
float32 f4或f 单精度浮点数,与c的float兼容
float64 f8或d 双精度浮点数,与c的double兼容和python的float对象
float128 f16或g 扩展进度浮点数
complex64(128、256) c8(16,32) 复数
bool ? 布尔类型
object O python对象类型
string_ S 固定长度的字符串类型,如S10
unicode_ U 固定长度的unicode类型,如U10

可以通过astype方法转换其dtype。

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

arr.dtype
dtype('int64')
float_arr = arr.astype(np.float64)

float_arr.dtype
dtype('float64')

调用astype无论如何都会创建一个新的数组,即使dtype一样。

数组和标量之间的运算

大小相等的数组之间的任何算术运算都会将运算应用到元素级。矢量化运算。

arr = np.array([[1,2,3],[4,5,6]],dtype='f4')

arr
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]], dtype=float32)
arr * arr
array([[  1.,   4.,   9.],
       [ 16.,  25.,  36.]], dtype=float32)
arr - arr
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]], dtype=float32)

数组与标量的算术运算也将会那个标量值传播到各个元素:

1 / arr
array([[ 1.        ,  0.5       ,  0.33333334],
       [ 0.25      ,  0.2       ,  0.16666667]], dtype=float32)

基本的索引和切片

arr = np.arange(10)

arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5],arr[5:8]
(5, array([5, 6, 7]))
arr[5:8]=12

arr
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

arr2d
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr2d[:2,1:]
array([[2, 3],
       [5, 6]])

布尔型索引

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])

data=np.random.randn(7,4)

names,data
(array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],
       dtype='|S4'),
 array([[ 0.58431783, -0.32250172,  0.93220636, -0.69585169],
        [-0.47121541,  0.02595873, -0.75045035, -0.0552076 ],
        [ 0.80959893,  0.17534421,  0.44307633,  1.18982735],
        [ 0.10955761,  0.39152736, -1.44976446,  0.20109315],
        [ 0.58365514, -0.16300416, -0.28480392, -0.23690772],
        [-0.13318635, -1.38864722,  0.61943625, -0.19675401],
        [-0.47054207, -0.458264  ,  0.49366592,  0.46391352]]))
names == 'Bob'
array([ True, False, False,  True, False, False, False], dtype=bool)
data[names == 'Bob']
array([[ 0.58431783, -0.32250172,  0.93220636, -0.69585169],
       [ 0.10955761,  0.39152736, -1.44976446,  0.20109315]])
data[names=='Bob',3]
array([-0.69585169,  0.20109315])
mask = (names == 'Bob') | (names == 'Will')

mask
array([ True, False,  True,  True,  True, False, False], dtype=bool)
data[mask]
array([[ 0.58431783, -0.32250172,  0.93220636, -0.69585169],
       [ 0.80959893,  0.17534421,  0.44307633,  1.18982735],
       [ 0.10955761,  0.39152736, -1.44976446,  0.20109315],
       [ 0.58365514, -0.16300416, -0.28480392, -0.23690772]])
data[data<0] = 0

data
array([[ 0.58431783,  0.        ,  0.93220636,  0.        ],
       [ 0.        ,  0.02595873,  0.        ,  0.        ],
       [ 0.80959893,  0.17534421,  0.44307633,  1.18982735],
       [ 0.10955761,  0.39152736,  0.        ,  0.20109315],
       [ 0.58365514,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.61943625,  0.        ],
       [ 0.        ,  0.        ,  0.49366592,  0.46391352]])

花式索引

arr = np.empty((8,4))

for i in range(8):
    arr[i] = i

arr
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.,  5.],
       [ 6.,  6.,  6.,  6.],
       [ 7.,  7.,  7.,  7.]])
arr[[4,3,0,6]]
array([[ 4.,  4.,  4.,  4.],
       [ 3.,  3.,  3.,  3.],
       [ 0.,  0.,  0.,  0.],
       [ 6.,  6.,  6.,  6.]])
arr = np.arange(32).reshape((8,4))
arr
array([[ 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]])
arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])

选取矩阵的行列子集是矩形区域。

arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

注意:花式索引根切片不一样,它总是将数据复制到新数组中。

数组转置和轴对换

  1. T属性
  2. transpose
  3. swapaxes

通用函数:快速的元素级数组函数

一种对ndarray中的数据执行元素级运算的函数

%matplotlib inline

points = np.arange(-5,5,0.01)
xs,ys=np.meshgrid(points,points)

import matplotlib.pyplot as plt

z = np.sqrt(xs**2+ys**2)
plt.imshow(z,cmap=plt.cm.gray)
plt.colorbar()
plt.title('Image plot of $\sqrt{x^2+y^2}$ for a grid of values')
<matplotlib.text.Text at 0x11d7162d0>
output_46_1.png

将条件逻辑表述为数组运算

numpy.where函数是三元表达式x if condation else y 的矢量化版本。

xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond=np.array([True,False,True,True,False])
np.where(cond,xarr,yarr)
array([ 1.1,  2.2,  1.3,  1.4,  2.5])

数学和统计方法

方法 说明
sum 对数组中全部或某轴向的元素求和
mean 算术平均数
std、var 标准差、方差
min、max 最小最大值
argmin、argmax 最小最大的索引
cumsum 所有元素的累计和
cumprod 所有元素的累计积

对于布尔类型数组,True会被转为1,False转为0
any方法测试数组中是否存在一个或多个True,all则检查数组中所有值是否都为True

排序

sort函数

唯一化以及其他的集合逻辑

方法 说明
unique(x) 数组中的唯一元素,并返回有序结果
intersect1d(x,y) x和y中的公共元素,并返回有序结果
union1d(x,y) 计算x和y的并集,并返回有序结果
in1d(x,y) 得到一个表示“x的元素是否包含于y”的布尔型数组
setdiffid(x,y) 集合的差,元素在x中且不在y中
setor1d(x,y) 集合的对称差,即存在与一个数组中但不同时存在于两个数组中的元素

线性代数

方法 说明
diag 以一维数组形式返回方针的对角线元素,或将一维数组转换为方阵
dot 矩阵乘法
trace 计算对角线元素的和
det 计算矩阵行列式
eig 计算方阵的本征值和本征向量
inv 计算方针的逆
pinv 计算矩阵的moore-Penrose伪逆
qr 计算QR分解
svd 计算奇异值分解
solve 解线性方程组Ax=b,其中A为一个方阵
svd 计算Ax=b的最小二乘解

随机数生成

方法 说明
seed 确定随机数生成器的种子
permutation 返回一个序列的随机排列或返回一个随机排列的范围
shuffle 对一个序列就地随机排列
rand 产生均匀分布的样本值
randint 从给定的上下限范围内随机选取整数
randn 产生正态分布
binomial 产生二项分布的样本值
normal 产生正态分布的样本值
beta 产生beta分布的样本值
chisquare 产生卡方分布的样本值
gamma 产生Gamma分布的样本值
uniform 产生在 [0,1)中均匀分布的样本值

想及时了解最新信息。扫一扫,添加关注微信公众号

weixin.jpg

原文地址:http://makerchen.com/2017/08/11/python-numpy-base/

上一篇 下一篇

猜你喜欢

热点阅读