Numpy学习笔记——Numpy基础

本文介绍了NumPy数组的基础知识,包括数组的创建、索引、切片、组合及分割等核心操作。同时还详细讲解了数据类型及其转换方法,并通过实例演示了如何利用NumPy进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.1 NumPy 数组对象

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

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

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

2.2 创建多维数组

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

In: m = array([arange(2), arange(2)])
In: m
Out:
array([[0, 1],
       [0, 1]])
In: m.shape
Out: (2, 2)

2.2.1 选取数组元素

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

In: a = array([[1,2],[3,4]])
In: a
Out:
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.0
In: int8(42.0)
Out: 42
In: bool(42)
Out: True
In: bool(0)
Out: False
In: bool(42.0)
Out: True
In: float(True)
Out: 1.0
In: 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.itemsize
Out: 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.char
Out: 'd'
In: t.type
Out: <type 'numpy.float64'>
In: t.str
Out: '<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: b
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]]])
Out: 0
In: b[:,0,0]
Out: array([ 0, 12])
//多个冒号可以用一个省略号(...)来代替
In: b[0, :, :]
In: b[0, ...]

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

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

In: b
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.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: a
Out:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
In: b = 2 * a
In: b
Out:
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: oned
Out: array([0, 1])
In: twice_oned = 2 * oned
In: twice_oned
Out: 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: a
Out:
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: c
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],
        [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.flat
In: for item in f: print item
In: b.flat[2]
In: b.flat[[1,3]]

2.12 动手实践:数组的转换

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

 In: b.tolist()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值