我是靠谱客的博主 瘦瘦大米,最近开发中收集的这篇文章主要介绍Python数据科学读书笔记2--Numpy入门(2)第二章 Numpy入门,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第二章 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入门所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部