NumPy 1-2

NumPy 1-2

[TOC]

多维数组

NumPy采用元组tuple作为数组的下标

创建多维数组 :

1
2
3
4
5
6
7
8
9
>>> import numpy as np
>>> np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
#0 -> 50方向为第0轴,0 -> 5的方向为第1

利用数组切片语法访问元素、整数序列和布尔数组访问多维数组元素

1
2
3
4
5
6
7
8
9
10
11
#利用数组切片语法访问元素
>>> a[0, 3:5]
array([3, 4])
>>> a[4: ,4:]
array([[44, 45],
[54, 55]])
>>> a[:,2]
array([ 2, 12, 22, 32, 42, 52])
>>> a[2::2, ::2]
array([[20, 22, 24],
[40, 42, 44]])
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> a[(0, 1, 2, 3, 4), (1, 2, 3, 4, 5)]
array([ 1, 12, 23, 34, 45])
>>> a[3:, [0, 2, 5]]
array([[30, 32, 35],
[40, 42, 45],
[50, 52, 55]])
>>> mask = np.array([1, 0, 1, 0, 0, 1], dtype=np.bool)
#第0轴方向第0,2,5位置,然后第一轴方向第2列
>>> a[mask, 2]
array([ 2, 22, 52])
#第0轴方向第3位置,然后第一轴方向0,2,5位置
>>> a[3, mask]
array([30, 32, 35])

结构数组(Tuple + Dict)

结构数组的dtype对象含有两个字典关键字: names和formats,每个关键字对应一个列表,names对应字段名,formats对应字段类型。

1
2
3
4
>>> persontype = np.dtype({'names':['name', 'age', 'weight'], 'formats':['S32', 'i', 'f']})
>>> a = np.array([("Chen", 32, 75.5), ("Zhou", 24, 65.2)], dtype=persontype)
>>> a.dtype
dtype([('name', 'S32'), ('age', '<i4'), ('weight', '<f4')])
1
2
3
4
5
6
7
8
>>> a[0]
(b'Chen', 32, 75.5)
>>> a[0][1]
32
>>> a[0].dtype
dtype([('name', 'S32'), ('age', '<i4'), ('weight', '<f4')])
>>> a[0][1].dtype
dtype('int32')

a[0]为结构元素,和数组a共享内存数据。

结构和字典类似,可以通过其names(类似key)得到值(value)。

1
2
3
4
5
6
7
>>> a[0]["name"]
b'Chen'
>>> a["name"]
array([b'Chen', b'Zhou'],
dtype='|S32')
>>> a['age']
array([32, 24], dtype=int32)

利用a.tofile可以输出数组的二进制形式。

操作函数ufunc()

我们利用np.cos()函数(属于ufunc运算)

1
2
3
4
>>> x = np.linspace(0, 2*np.pi, 7)
>>> y = np.cos(x)
>>> y
array([ 1. , 0.5, -0.5, -1. , -0.5, 0.5, 1. ])

对比Python自带的math库的math.sin()和np.sin(),加上time库

发现,对于单个计算,math.sin()更快,但是多个计算时,np.sin()快

此外,两者的结果的类型不同

1
2
3
4
>>> type(math.sin(1))
<class 'float'>
>>> type(np.sin(1))
<class 'numpy.float64'>

add()函数

np.add(a,b)返回a,b数组相加之和,np.add(a,b,a)返回a += b的结果a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> a = np.arange(0, 4)
>>> b = np.arange(1, 5)
>>> c = np.add(a, b)
>>> d = np.add(a, b, a)
>>> a
array([1, 3, 5, 7])
>>> b
array([1, 2, 3, 4])
>>> c
array([1, 3, 5, 7])
>>> d
array([1, 3, 5, 7])
>>> a
array([1, 3, 5, 7])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> a
array([0, 1, 2, 3])
>>> b
array([1, 2, 3, 4])
>>> np.subtract(a, b)
array([-1, -1, -1, -1])
>>> np.multiply(a, b)
array([ 0, 2, 6, 12])
>>> np.divide(a, b)
array([ 0. , 0.5 , 0.66666667, 0.75 ])
>>> np.true_divide(a, b)
array([ 0. , 0.5 , 0.66666667, 0.75 ])
>>> np.floor_divide(a, b)
array([0, 0, 0, 0])
>>> np.negative(a)
array([ 0, -1, -2, -3])
>>> a
array([0, 1, 2, 3])
>>> np.power(a, b)
array([ 0, 1, 8, 81])
>>> np.remainder(a, b)
array([0, 1, 2, 3])
>>> np.mod(a, b)
array([0, 1, 2, 3])

分段函数 -> frompyfunc函数

frompyfunc(func, nin, nout)函数,三个参量分别代表计算单个元素的函数,此函数的输入参数的个数,此函数返回值的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
def triangle_func(c, c0, hc):
def trifunc(x):
x = x -int(x) #三角波周期为1
if x >= c:
r = 0.0
elif x < c0:
r = x / c0 * hc
else:
r = (c-x) / (c-c0) * hc
return r
return np.frompyfunc(trifunc, 1, 1)

x = np.linspace(0, 2, 10)
y2 = triangle_func(0.6, 0.4, 1.0)(x)

Broadcasting :

ogrid()对象 [注意不是函数]

语法为ogrid[a: b : cj],分别为初值,终值,长度j

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> x,y = np.ogrid[0:5, 0:5]
>>> x
array([[0],
[1],
[2],
[3],
[4]])
>>> y
array([[0, 1, 2, 3, 4]])
>>> x,y = np.ogrid[0:4:3j, 0:1:2j]
>>> x
array([[ 0.],
[ 2.],
[ 4.]])
>>> y
array([[ 0., 1.]])

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!