Python数据分析篇:(二)数组索引、切片和运算
一、索引和切片
(1)一维
可以理解成列表的索引,规则相同。
对每个元素事先进行0 1 2 3……的编号(另有负编号对应……-3 -2 -1 )
输入单个数字编号,则索引对应编号的元素。
加入引号,则索引从a元素到b元素,但不包括b编号的元素
详细规则讲解,可以观看如下文章:
Python知识点精汇!字符串:定义、截取(索引)和其内置函数_python 字符串截取-CSDN博客https://blog.csdn.net/2301_81711570/article/details/143814571示例:
我们可能会发现,2 5都是孤零零一个数字,而下面的2却有[ ] 为什么呢?
这是因为a1[2]是
索引为2的单个元素。它直接返回该元素的值
而a1[2:3]
这是一个切片操作,返回的是一个子数组,即返回从索引2到3(但不包含3)的部分
(2)多维
单维:
[0 1 2]
多维:
[0 1 2]
[3 4 5]
关于多维的索引,规则也和单维大同小异。
其大体格式如下:
a[ m : n , p : q ]
我们只需要记住:
逗号左边是索引行,逗号右边是索引列
引号就是从谁到谁
举个例子:
print(a1[0,0:2]):先索引第0行,再索引第0行的第0到1列,所以是[0 1]
print(a1[:,1]):先索引最开始行到最后行(即所有行),再索引所有行的第1列,所以是[1 4]
print(a1[:1,:2]):先索引最开始行到编号1行(不包括1行),即索引的第0行,然后再索引第0行的最开始列到编号为2的列(不包括编号2列),即第0行的0和1列,所以是[[0 1]]
在这里,我们同样可以看到[0 1]和[1 4]只有1个括号,但是为什么[[0 1]]有两个?
这是因为前两者返回的是一维数组,所以只有一个方括号。
而后者返回的是二维数组(即使只有一行),所以有两个方括号,表示它是一个包含一行的二维数组。
如果我们嫌麻烦或者不理解,也有记住的诀窍:
我们只需要记住,有几个引号,就有几个方括号。
不信你看看一维和多维的列子,是不是都是这样
(3)扩展
扩展一个知识,直接看例子:
这个括号是什么意思呢??
意思就是索引,这不过此处逗号的意思变成了“和”
所以a1[(0,1),(1,2)]的意思就是:
索引0行1列的元素和1行2列的元素,即1和5
Tips:
此时,我们若再想知道有几个方括号,就不可以那么数引号了,中规中矩的算吧。
二、运算
(1)四则运算
四则运算还是:
+、-、*、/、**(幂)
具体可自学离散数学中关于矩阵数组一类的运算知识了
如:
(2)广播机制
先摆一下标准解释:
NumPy 的 ufunc(通用函数)广播机制使得不同形状的数组在进行元素级操作时能够兼容计算。通过广播,NumPy 能够自动调整数组的形状,使得不同维度的数组能够进行高效的数学运算,而不需要显式地复制数据。
广播机制的工作基于以下几个规则:
-
如果两个数组的维度不同,NumPy 会尝试通过在较小维度的前面添加 "1" 来扩展它们的形状,使得它们在形状上兼容。这个过程称为 "扩展"(broadcasting)。
-
广播的条件:两个数组在做元素级操作时,必须满足以下条件之一:
- 维度相同:两个数组的维度数相同。
- 某些维度的大小为1:如果某个维度的大小为 1,则该维度的大小可以扩展,以匹配另一个数组在该维度的大小。
我们跳过繁琐的解释,通俗的解释一下:
如果数组a和数组b的形状不一样,那就让小的那个数组变成跟大的那个数组形状一样了,再去计算。
至于怎么变,那就是复制粘贴。
我们结合一个例子来理解:
比如矩阵a1是[0 1 2]
[3 4 5]
矩阵a2是:[0 1 2]
我们让两个矩阵相加,即a1+a2
a2会先变成[0 1 2]
[0 1 2]
然后再去和a1相加
如图:
即,小的数组,会复制粘贴已有的行或列,自动补齐成和大数组形状一样的,再去运算
如果有的少行,有的少列,那就补齐成二者所能共同形成的最小形状 ,如下例子
:::
如果情况复杂一些,诸如:
a 的形状从1 2 3 变成了 1 2 3
1 2 3
b 的形状从10
20
变成了10 10 10
20 20 20
最终,两个数组的形状变成了 (2, 3)在去计算即可。