Numpy入门(二):Numpy数组索引切片和运算

在Numpy中建立了数组或者矩阵后,需要访问数组里的成员,改变元素,并对数组进行切分和计算。

索引和切片

Numpy数组的访问模式和python中的list相似,在多维的数组中使用, 进行区分:

在python的list 下:

a = [1,2,4]
print a[2:]

打印出:

[4]

这是一个数组,在Numpy的多维数组中也采用相同的模式进行数组的访问:

import numpy as np

a = np.arange(1,37)
a = a.reshape(6,6)
print a

这里使用了 reshape,把原来的1x36的数组,变成了6x6的矩阵。

打印:

[[ 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 32 33 34 35 36]]

a[1,1] = 8
print a

打印:

[[ 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 32 33 34 35 36]]

print a[1:4,3:]

打印:

[[10 11 12]
 [16 17 18]
 [22 23 24]]

在二维数组中较为简单,, 前面是横坐标,, 后面是纵坐标,可以用这种方式推广到多维的数组。

牢记这一点,再看看下面的布尔索引就简单多了:

>>> arr3 = (np.arange(36)).reshape(6,6)
>>> arr3
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, 32, 33, 34, 35]])
>>> x = np.array([0, 1, 2, 1, 4, 5])
>>> arr3[x == 1]
array([[ 6,  7,  8,  9, 10, 11],
       [18, 19, 20, 21, 22, 23]])
>>> arr3[:,x == 1]
array([[ 1,  3],
       [ 7,  9],
       [13, 15],
       [19, 21],
       [25, 27],
       [31, 33]])
>>>

矩阵的运算

Numpy提供的较多的矩阵运算,可以查看相应的文档,这里介绍几种常见的运算方式来说明如何使用运算。

四则运算:

在加减乘除运算中,必须保证操作的数组具有相同的形状。

>>> a=np.arange(1,37)
>>> a=a.reshape(6,6)
>>> b=np.arange(1,26)
>>> b = b.reshape(5,5)
>>> a +b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (6,6) (5,5)

数组中的运算是对每个元素进行的运算,如:

import numpy as np

a = np.arange(1,7)
a = a.reshape(2,3)
print 2*a
#[[ 2  4  6]
#[ 8 10 12]]

数组的点乘

数组的点乘操作:

>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
       [2, 2]])

where 条件

numpy.where(condition, [x, y, ]/)

满足条件,输出x,否则输出 y

>>> print a
[[ 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 32 33 34 35 36]]
>>> print np.where(a>6,a,6)
[[ 6  6  6  6  6  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 32 33 34 35 36]]

常用的统计函数

  • 最大最小值:

按轴方向的最大最小值,如果不填参数,那按照全局来算。

min,max,或者amin,amax,要说minamin有啥区别,感觉aminmin的升级版。

>>> print a
[[ 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 32 33 34 35 36]]
>>> a.min()
1
>>> a.min(0)
array([1, 2, 3, 4, 5, 6])
>>> a.min(1)
array([ 1,  7, 13, 19, 25, 31])
>>> np.amin(0)
0
>>> np.amin(1)
1
>>> np.amin(a,0)
array([1, 2, 3, 4, 5, 6])
>>>
  • 最大最小值位置

argmaxargmin

>>> np.argmax(a)
35
>>> a.argmax()
35
>>> a.argmax(0)
array([5, 5, 5, 5, 5, 5])
>>> a.argmax(1)
array([5, 5, 5, 5, 5, 5])
>>>
  • 均值和中位数

按轴方向的计算,如果不填参数,那按照全局来算。

mean,即平均值。

median,即中位数。

比较奇怪的是numpy.ndarray 没有实现median

>>> np.mean(a)
18.5
>>> a.mean()
18.5
>>> a.median()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'median'
>>> np.median(a)
18.5

numpy.sum 对某一维进行求和运算:

import numpy as np

a = np.arange(1,7)
a = a.reshape(2,3)
print a

print np.sum(a)
# 21

#[[1 2 3]
 #[4 5 6]]
	
print np.sum(a,0)
#[5 7 9]

print np.sum(a,1)
#[ 6 15]
  • 标准差

std按轴方向计算标准差。

>>> a.std()
10.388294694831615
>>> np.std(a)
10.388294694831615
  • 方差

var按轴方向计算方差。

>>> np.var(a)
107.91666666666667
>>> a.var()
107.91666666666667
  • 协方差矩阵

cov 为协方差矩阵。

>>> np.cov(a)
array([[3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
       [3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
       [3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
       [3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
       [3.5, 3.5, 3.5, 3.5, 3.5, 3.5],
       [3.5, 3.5, 3.5, 3.5, 3.5, 3.5]])
  • 累积和,累积乘积

  • 皮尔逊相关系数

皮尔逊相关系数:corrcoef

>>> np.corrcoef(a)
array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])

矩阵运算

  • 相乘和点乘

所谓的点乘,也就是 大学里学习矩阵,矩阵乘法,矩阵的行向量,乘与另一个矩阵的列,在相加,得到一个向量。这样,就需要两个矩阵的行数和另一个矩阵列数,否则会报错。

>>> a = np.array([[2,3],[3,4]])
>>> b = np.array([[3,4],[4,5]])
>>> print a*b
[[ 6 12]
 [12 20]]
>>> print a.dot(b)
[[18 23]
 [25 32]]

Numpy提供了大量的运算函数,在机器学习中也经常用到,对Numpy的熟悉,以后学起机器学习会轻松很多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值