概述
第二章 Numpy入门
2.2 Numpy数组基础
本节将介绍以下几类基本的数组操作:
- 数组的属性 – 确定数组的大小、形状、存储大小、数据类型;
- 数组的索引 – 获取和设置数组各个元素的值;
- 数组的切分 – 在大的数组中获取或设置更小的子数组;
- 数组的变形 – 改变给定数组的形状;
- 数组的拼接和分裂 – 将多个数组合并为一个,以及将一个数组分类成多个。
2.2.1Numpy数组的属性
定义三个随机的数组:一个一维数组、一个二维数组和一个三维数组。
>>> import numpy as np
>>> x1 = np.random.randint(10,size=6)
# 一维数组
array([5, 0, 3, 3, 7, 9])
>>> x2 = np.random.randint(10,size=(3,4))
# 二维数组
array([[3, 5, 2, 4],
[7, 6, 8, 8],
[1, 6, 7, 7]])
>>> x3 = np.random.randint(10,size=(3,4,5))
# 三维数组
array([[[8, 1, 5, 9, 8],
[9, 4, 3, 0, 3],
[5, 0, 2, 3, 8],
[1, 3, 3, 3, 7]],
[[0, 1, 9, 9, 0],
[4, 7, 3, 2, 7],
[2, 0, 0, 4, 5],
[5, 6, 8, 4, 1]],
[[4, 9, 8, 1, 1],
[7, 9, 9, 3, 6],
[7, 2, 0, 3, 5],
[9, 4, 4, 6, 4]]])
每个数组都有nidm(数组的维度),shape(数组的形状)和size(数组的总大小)属性:
我们以三维数组为例:
>>> x3.ndim
3
>>> x3.shape
(3, 4, 5)
>>> x3.size
# 3*4*5 = 60
60
注意:以上都是数组本身的属性,并不是方法,千万不要加括号,如.shape()这样使用是错误的!!!
另一个有用的属性是dtype,他是数组的数据类型:
>>> x3.dtype
dtype('int32')
其他的属性包括表示每个数组元素字节大小的itemsize,以及表示数组总字节大小的属性nbytes:
>>> x3.itemsize
4
>>> x3.nbytes
# 一般来说,可以认为nbytes 跟itemsize 和size 的乘积大小相等
240
2.2.2 数组索引:获取单个元素
Numpy的索引和Python列表一样,都是通过中括号中指定索引获取第i个值,从0开始计数:
>>> x1
array([5, 0, 3, 3, 7, 9])
>>> x1[1]
# 取第二个值
0
>>> x1[-1]
# 取倒数第一个值
9
在多维数组中,可以用逗号分隔的索引元组获取元素:
>>> x2
array([[3, 5, 2, 4],
[7, 6, 8, 8],
[1, 6, 7, 7]])
>>>x2[0,1]
# 取二维数组里面第一个一维数组的第二个元素
5
2.2.3 数组切片:获取子数组
Numpy的切片操作和Python列表的切片相同。切片符号使用冒号(:)表示
为了获取数组的一个切片,可以用一下方式:
x[start:stop:step]
如果上面三个参数并未同时指定,那么会使用其默认值start=0,stop=维度的大小,step=1.
对于区间来说,前闭后开,最后一个索引是取不到的
1.一维子数组
>>> x = np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[:5]
#取索引值从0到4的元素
array([0, 1, 2, 3, 4])
>>> x[5:]
#取索引值从5到最后一个元素
array([5, 6, 7, 8, 9])
>>> x[4:7] #取索引值从4到6的元素
array([4, 5, 6])
>>> x[::2] #每隔一个取一个元素
array([0, 2, 4, 6, 8])
当步长为负值时,start和stop的参数默认互换,因此这是一种非常方便的逆序数组的方式:
>>> x[::-1]
#所有元素逆序排列
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> x[5::-2] #从索引5开始每隔一个元素逆序
array([5, 3, 1])
2.多维子数组
多维切片也采用同样的方式处理,用冒号分割
>>> x2
array([[3, 5, 2, 4],
[7, 6, 8, 8],
[1, 6, 7, 7]])
>>> x2[::-1]
#先看一下只有前半部分,帮助理解
array([[1, 6, 7, 7],
[7, 6, 8, 8],
[3, 5, 2, 4]])
>> x2[:2]
array([[3, 5, 2, 4],
[7, 6, 8, 8]])
>> x2[:2,:3]
#前两行,前三列
array([[3, 5, 2],
[7, 6, 8]])
>> x2[:3, ::2] ## 所有行,每隔一列
array([[3, 2],
[7, 8],
[1, 7]])
最后,子数组维度也可以同时被逆序:
>>> x2[::-1,::-1]
array([[7, 7, 6, 1],
[8, 8, 6, 7],
[4, 2, 5, 3]])
3.获取数组的行和列
一种常见的需求是获取数组的单行和单列。你可以将索引与切片组合起来实现这个功能,
用一个冒号(:)表示空切片:
>>> print(x2[:, 0]) #获取x2的第一列
[3 7 1]
>>> print(x2[1, :]) # x2的第二行
[7 6 8 8]
# 如果是获取行的时候,可以省略空的切片:
>>> print(x2[0])
#等同于x2[0,:]
[1 6 7 7]
4.非副本视图的子数组
关于数组切片,那就是数组切片返回的是数组数据的视图,而不是数值数据的副本。因为Numpy一般用来处理大数据,如果对于大数据切片进行复制,则对于内存占用很大。
>>> x2
array([[3, 5, 2, 4],
[7, 6, 8, 8],
[1, 6, 7, 7]])
>>> a = x2[:2,:2]
>>> a
array([[3, 5],
[7, 6]])
# 现在修改这个子数组a,原始数组也将被修改!
>>> a[1,1] = 10
>>> a
array([[ 3,
5],
[ 7, 10]])
>>> x2
array([[ 3,
5,
2,
4],
[ 7, 10,
8,
8],
[ 1,
6,
7,
7]])
5.创建数组的副本
当有需要数据副本,需要复制数据的时候,可以通过copy()方法实现:
>>> x2_copy = x2[:2,:2].copy()
>>> x2_copy
array([[ 3,
5],
[ 7, 10]])
>>> x2_copy[1,1] = 6
# 修改副本的值
>>> x2_copy
array([[3, 5],
[7, 6]])
>>> x2
#原数组值不变
array([[ 3,
5,
2,
4],
[ 7, 10,
8,
8],
[ 1,
6,
7,
7]])
最后
以上就是瘦瘦大米为你收集整理的Python数据科学读书笔记2--Numpy入门(2)第二章 Numpy入门的全部内容,希望文章能够帮你解决Python数据科学读书笔记2--Numpy入门(2)第二章 Numpy入门所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复