Numpy学习笔记——Numpy基础

来源:互联网 发布:魏颖 知乎 编辑:程序博客网 时间:2024/06/09 07:00

2.1 NumPy 数组对象

NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:
实际的数据;
描述这些数据的元数据。

NumPy数组一般是同质的。
用arange函数创建数组并获取其维度:
arr.shape:返回的tuple元组

In: a = arange(5)In: a.dtypeOut: dtype('int64')In: a.shape

2.2 创建多维数组

array函数可以依据给定的对象生成数组。给定的对象应是类数组,如Python中的列表,返回的是numpy.ndarray。

In: m = array([arange(2), arange(2)])In: mOut:array([[0, 1],       [0, 1]])In: m.shapeOut: (2, 2)

2.2.1 选取数组元素

给array函数传递的对象是一个嵌套的列表,

In: a = array([[1,2],[3,4]])In: aOut:array([[1, 2],       [3, 4]])In: a[0,0]Out: 1

2.2.2 NumPy 数据类型

bool 用一位存储的布尔类型(值为TRUE或FALSE)
inti 由所在平台决定其精度的整数(一般为int32或int64)
int8 整数,范围为.128至127
int16 整数,范围为.32 768至32 767
int32 整数,范围为.231至231 .1
int64 整数,范围为.263至263 .1
uint8 无符号整数,范围为0至255
uint16 无符号整数,范围为0至65 535
uint32 无符号整数,范围为0至232.1
uint64 无符号整数,范围为0至264.1
float16 半精度浮点数(16位):其中用1位表示正负号,5位表示指数,10位表示尾数
float32 单精度浮点数(32位):其中用1位表示正负号,8位表示指数,23位表示尾数
float64或float 双精度浮点数(64位):其中用1位表示正负号,11位表示指数,52位表示尾数
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128或complex 复数,分别用两个64位浮点数表示实部和虚部

每一种数据类型均有对应的类型转换函数:
需要注意的是,复数是不能转换为整数的,同样,复数也不能转换为浮点数。不过,浮点数却可以转换为复数,例如complex(1.0).有j的部分为复数的虚部。

In: float64(42)Out: 42.0In: int8(42.0)Out: 42In: bool(42)Out: TrueIn: bool(0)Out: FalseIn: bool(42.0)Out: TrueIn: float(True)Out: 1.0In: float(False)Out: 0.0

在NumPy中,许多函数的参数中可以指定数据类型:

In: arange(7, dtype=uint16)Out: array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)

2.2.3 数据类型对象

数据类型对象是numpy.dtype类的实例,数据类型对象可以给出单个数组元素在
内存中占用的字节数

In: a.dtype.itemsizeOut: 8

2.2.4 字符编码

创建了一个单精度浮点数数组:

In: arange(7, dtype='f')Out: array([ 0., 1., 2., 3., 4., 5., 6.], dtype=float32)In: arange(7, dtype='D')Out: array([ 0.+0.j, 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j, 6.+0.j])

2.2.5 自定义数据类型

可以使用Python中的浮点数类型:
完整的NumPy数据类型列表可以在sctypeDict.keys()中找到

In: dtype(float)Out: dtype('float64')

2.2.6 dtype 类的属性

获取数据类型的字符编码:

In: t = dtype('Float64')In: t.charOut: 'd'In: t.typeOut: <type 'numpy.float64'>In: t.strOut: '<f8'

2.3 动手实践:创建自定义数据类型

创建数据类型:

t = np.dtype([('name', np.str_, 40), ('numitems', np.int32), ('price',np.float32)])

查看数据类型:

In: t['name']Out: dtype('|S40')

创建自定义数据类型的数组

In: itemz = array([('Meaning of life DVD', 42, 3.14), ('Butter', 13,2.72)], dtype=t)In: itemz[1]Out: ('Butter', 13, 2.7200000286102295)

2.4 一维数组的索引和切片

In: a = arange(9)In: a[3:7]Out: array([3, 4, 5, 6])In: a[:7:2]Out: array([0, 2, 4, 6])In: a[::-1]Out: array([8, 7, 6, 5, 4, 3, 2, 1, 0])

2.5 多维数组的切片和索引

用arange函数创建一个数组并改变其维度:
下面是一个从1维数组变为3维数组,2表示第一维上有两个元素,3表示第二维上有3个元素…是一个2×3×4的三维数组

In: b = arange(24).reshape(2,3,4)In: b[0,0,0]In: bOut: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]]])Out: 0In: b[:,0,0]Out: array([ 0, 12])//多个冒号可以用一个省略号(...)来代替In: b[0, :, :]In: b[0, ...]

2.6 动手实践:改变数组的维度

ravel:将数组展平,是返回数组的一个视图,flatten函数会请求分配内存来保存结果

In: bOut: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]]])In: b.ravel()Out: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])In: b.flatten()Out: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])//用一个正整数元组来设置数组的维度In: b.shape = (6,4)

transpose 转置矩阵
resize resize和reshape函数的功能一样,但resize会直接修改所操作的数组

In: b.transpose()In: b.resize((2,12))

2.7 数组的组合

(1) 水平组合

In: a = arange(9).reshape(3,3)In: aOut:array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])In: b = 2 * aIn: bOut:array([[ 0, 2, 4],       [ 6, 8, 10],       [12, 14,16]])In: hstack((a, b))Out:array([[ 0, 1, 2, 0, 2, 4],       [ 3, 4, 5, 6, 8,10],       [ 6, 7, 8,12,14,16]])In: concatenate((a, b), axis=1)

(2) 垂直组合:

In: vstack((a, b))Out:array([[ 0, 1, 2],       [ 3, 4, 5],       [ 6, 7, 8],       [ 0, 2, 4],       [ 6, 8,10],       [12,14,16]])In: concatenatel((a, b), axis = 0)Out:array([[ 0, 1, 2],       [ 3, 4, 5],       [ 6, 7, 8],       [ 0, 2, 4],       [ 6, 8,10],       [12,14,16]])

(3) 深度组合

In: dstack((a, b))Out:array([[[0, 0],        [1, 2],        [2, 4]],       [[3, 6],        [4, 8],        [5,10]],       [[6,12],        [7,14],        [8,16]]])

(4) 列组合 column_stack函数对于一维数组将按列方向进行组合:

In: oned = arange(2)In: onedOut: array([0, 1])In: twice_oned = 2 * onedIn: twice_onedOut: array([0, 2])In: column_stack((oned, twice_oned))Out:array([[0, 0],       [1, 2]])In: column_stack((a, b))Out:array([[ 0, 1, 2, 0, 2, 4],       [ 3, 4, 5, 6, 8,10],       [ 6, 7, 8,12,14,16]])//可以用==运算符来比较两个NumPy数组In: column_stack((a, b)) == hstack((a, b))

(5) 行组合 当然,NumPy中也有按行方向进行组合的函数

In: row_stack((oned, twice_oned))Out:array([[0, 1],       [0, 2]])

2.9 数组的分割

(1) 水平分割

In: aOut:array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])In: hsplit(a, 3)Out:[array([[0],        [3],        [6]]),array ([[1],        [4],        [7]]),array ([[2],        [5],        [8]])]In: split(a, 3, axis=1)

(2) 垂直分割:

In: vsplit(a, 3)Out: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]In: split(a, 3, axis=0)

(3) 深度分割:

In: c = arange(27).reshape(3, 3, 3)In: cOut: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]]])In: dsplit(c, 3)

2.11 数组的属性

ndim属性,给出数组的维数,或数组轴的个数
size属性,给出数组元素的总个数
itemsize属性,给出数组中的元素在内存中所占的字节数
T属性的效果和transpose函数一样:

In: b.T

在NumPy中,复数的虚部是用j表示的:

In: b = array([1.j + 1, 2.j + 3])

real属性,给出复数数组的实部:

In: b.real

imag属性,给出复数数组的虚部:

In: b.imag

flat属性将返回一个numpy.flatiter对象,这是获得flatiter对象的唯一方式,“扁平迭代器”可以让我们像遍历一维数组一样去遍历任意的多维数组:

In: b = arange(4).reshape(2,2)In: f = b.flatIn: for item in f: print itemIn: b.flat[2]In: b.flat[[1,3]]

2.12 动手实践:数组的转换

使用tolist函数将NumPy数组转换成Python列表:

 In: b.tolist()
原创粉丝点击