学习Numpy的基本应用

首先需要导入Numpy包

1
from numpy import *

一、ndarray数组

1、数组的生成

1
>>>a = array([0,1,2,3])

可以与C语言一样用索引来定位数组元素,如:

1
>>>a[0] = 5

也可以将数组改为二维数组

1
2
3
4
>>>a.shape = 2,2
>>>print(a)
[[5 1]
[2 3]]

特例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>>b = zeros((2,3),dtype=int)#生成2行3列的0填充数组
[[0 0 0]
[0 0 0]]
>>>a = ones((3,2),dtype=int) * 5
[[5 5]
[5 5]
[5 5]]
>>>b.fill(-4.8)#向数组中填充元素,填充元素会转化为数组原数据类型
[[-4 -4 -4]
[-4 -4 -4]]
>>>a = arange(0,80,10)#start到end间隔是10左闭右开
array([ 0, 10, 20, 30, 40, 50, 60, 70])
>>>a = identity(3,dtype=int)#生成单位矩阵
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])

2、数组的类型

复数数组

1
2
3
4
>>>a = array([1 + 1j, 2, 3, 4])
>>>a.real#实部
>>>a.imag#虚部
>>>a.conj()#查看共轭

类型转换:

1
2
>>>asarray(a, dtype=float64)#不会修改原数组的值,但转换与原数组类型相同时返回引用
>>>a.astype(float64)#无论何时返回复制

3、数组的属性

1
2
3
4
>>>a.size#数组的大小
>>>a.shape#数组的形状
>>>a.nbytes#数组元素所占空间
>>>a.ndim#数组维数

4、数组索引切片

花式索引:
与切片不同花式索引返回的是对象的一个复制不是引用。

1
2
>>>indices = [1, 2, -3]
>>>y = a[indices]

还可以用bool值

1
2
>>>mask = array([0,1,1,0,0,1,0,0],dtype=bool)
>>>a[mask]

mask数组可以用布尔表达式生成

1
2
3
4
>>>from numpy.random import rand
>>>a = rand(10)#生成[0,1)之间的10个随机数
>>>mask = a > 0.5
>>>a[mask]

二维花式索引:

1
2
3
4
5
6
>>>a[(0,1,2,3,4), (1,2,3,4,5)]
#行标列标一一对应,a[0,1],a[1,2]...5个数
>>>a[3:, [0,2,5]]#第四行后,1,3,6列
>>>mask = array([1,0,1,0,0,1],dtype=bool)
>>>a[mask, 2]#依然可以用mask索引
>>>y = a[:3]#返回前3行

where语句:

1
2
3
4
5
>>>loc = where(a > 10)
>>>a[loc]
(array([0, 0, 1, 1], dtype=int64), array([1, 3, 2, 3], dtype=int64))
#如同二维花式索引,行列坐标一一对应
>>>rows, cols = where(a>10)

5、数组的方法

求和:

1
2
3
4
5
6
>>>a = array([[1,2,3],[4,5,6]])a.sum(axis=1)
>>>sum(a)
>>>sum(a,axis=0)#或者a.sum(axis=0)沿着第一维度增方向求和,得到行向量
array([5, 7, 9])
>>>sum(a,axis=1)#或者a.sum(axis=1)沿着第而维度增方向求和,得到类向量
array([ 6, 15])

求积:

1
2
>>>a.prod()
>>>prod(a, axis=0)

最大值最小值:

1
2
3
4
>>>a.max()#全局最大
>>>a.max(axis=-1)
>>>a.min()#全局最小
>>>a.min(axis=0)#沿着第一维度最小,得到行向量

最大值最小值位置:

1
2
>>>a.argmin()
>>>a.argmax(axis=0)

均值:

1
2
3
>>>a.mean()
>>>a.mean(axis=-1)
>>>average(a, axis = 0, weights=[1,2])#可以算加权平均

标准差:

1
>>>a.std(axis=1)

方差:

1
>>>a.var(axis=1)

将数值限制在某个范围内:

1
2
3
4
>>>a = array([[1, 2, 3],[4, 5, 6]])
>>>a.clip(3,5)
array([[3, 3, 3],
[4, 5, 5]])

计算最大值与最小值之差:

1
>>>a.ptp(axis=1)

近似方法:

1
>>>a.round(decimals=1)#近似到以为小数

6、数组排序

分为函数和方法
注意:其他三种不改变原数组,只有data.sort()方法会改变

1
2
3
4
>>>sort(weights)#函数
>>>data.sort()#方法 注意注意
>>>argsort(weights)#函数
>>>data.argsort()#方法

对二维数组默认相当于对每一行的元素进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
>>>a = array([
[.2, .1, .5],
[.4, .8, .3],
[.9, .6, .7]
])
>>>sort(a)
array([[ 0.1, 0.2, 0.5],
[ 0.3, 0.4, 0.8],
[ 0.6, 0.7, 0.9]])
>>>sort(a, axis = 0)
array([[ 0.2, 0.1, 0.3],
[ 0.4, 0.6, 0.5],
[ 0.9, 0.8, 0.7]])

7、数组形状

修改形状

1
2
3
>>>a = arange(6)
>>>a.shape = 2,3
>>>b = a.reshape(3,2)#返回一个新数组

数组连接

1
2
3
4
5
6
7
8
9
10
x = array([
[0,1,2],
[10,11,12]
])
y = array([
[50,51,52],
[60,61,62]
])
z = concatenate((x,y))#第一维度连接
z = concatenate((x,y), axis=1)#第二维度连接

降维

1
2
3
a = array([[0,1],
[2,3]])
b = a.flatten()#降为1维数组

8、数组对角线

1
2
3
>>>a.diagonal()
>>>a.diagonal(offset=1)#对角线右移
>>>a.diagonal(offset=-1)#对角线左移