NumPy数据分析基础:ndarray数组运算基本操作及切片索引迭代

简介: NumPy数据分析基础:ndarray数组运算基本操作及切片索引迭代

前言


作为数据分析三巨头Pandas、matplotlib、NumPy之一,必然要给足面子单独拿出来讲解一波。NumPy应用场景十分宽泛,Pandas很多函数转换后也都是NumPy数组类型的数据结构。在机器学习、深度学习以及一些数据处理操作中使用的频率甚至比Pandas都高。而且NumPy功能强大,使用起来也十分便捷,支持多种复杂操作。平时我的Pandas以及一些机器学习的文章都有用到NumPy,但是博客内容并没有详细解答NumPy的操作也没有记录有关NumPy操作的一些具体函数解答。对于我这种追求一站式服务需求的博主来说着实有点不妥,故把旧坑补上,出一期全新的一文速学系列-Numpy数据分析基础专栏。


此系列文章将被纳入我的专栏一文速学系列-NumPy数据分析基础,基本覆盖到使用NumPy数据分析日常业务以及常规的数学建模分析以及复杂操作方方面面的问题。从基础的数组操作逐步入门到处理矩阵矢量特征等复杂操作,以及专业的NumPy常用函数讲解,我都将花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发、数学建模、Python工程的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。


本章节主要详解关于numpy数组对象ndarray的基础数学运算操作,例如加减乘除的矩阵数组运算法则,以及通用常用的数学函数。


一、基础数学运算


数组上的算术运算符以元素为单位进行,将创建一个新数组并用结果填充。


1.加减

a = np.array([20, 30, 40, 50])
b = np.arange(10,50,10)
c=a-b
c

bd28363d5b3649c4b27a02a6713e8066.png


2.乘方


a**2


07dcb457d755450189371e7c298d1e9f.png


3.条件筛选


a<40

f1db394083b341f58ebface05af4bc0f.png

与许多矩阵语言不同,乘积运算符*在NumPy数组中操作元素。矩阵乘积可以使用@运算符(在python版本>=3.5)或点函数或方法执行:


4.矩阵元素相乘

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
A*B

231096fbd1594d3d8507c345f13c5241.png

5.矩阵乘法


A@B

b1115ae8bc534e64a5f3c1fffb4d3b2d.png


或者使用dot函数也是一样的:


A.dot(B)

8f1bc7e23b9b46e0b33334671607c82a.png


某些操作(如+=和*=)用于修改现有数组,而不是创建新数组。

a = np.ones((2, 3), dtype=int)
a*=3
a


047af721a95249b58d0ca94e17871191.png


a = np.ones((2, 3), dtype=int)
b = np.zeros((2, 3), dtype=int)
b += a
b

e7ff1af55ac8481bbe4b0bdcbc502802.png

6.数组类型隐式转换


当使用不同类型的数组操作时,生成的数组的类型对应于更一般或更精确的类型(一种称为upcasting的行为)。


a = np.ones((2, 3), dtype=int)
b = np.zeros((2, 3), dtype=float)
c=a+b
c.dtype.name

17d38647d31e4df0a19d7577b09eb88d.png

许多一元操作,例如计算数组中所有元素的总和,都是作为ndarray类的方法实现的。

c.sum()
c.max()
c.min()


默认情况下,这些操作应用于数组,就好像它是一个数字列表,而不管其形状如何。但是,通过指定axis参数,可以沿数组的指定轴应用操作:

b = np.arange(12).reshape(3, 4)
b

9e81e8dc83cd40998a3b8e6a716e71c2.png


b.sum(axis=0)

1441d203d4b642a2938ec5af77a3562e.png

b.min(axis=1)

662040a508f94fc490b26e30bea73009.png

b.cumsum(axis=1)

195b6e1d20534bbfa9f16093754842a8.png

二、切片索引和迭代


1.一维数组


一维数组可以被索引、切片和迭代,就像列表和其他Python序列一样。

a=np.arange(10,20,2)
a[2]

3b3ab3edbcc9428da8add4628b4f654d.png

a[2:5]

01b18c3177524b9badc1c222a26348c2.png

2.多维数组


多维数组的每个轴可以有一个索引。这些索引以逗号分隔的元组形式给出:

def f(x, y):
    return 10 * x + y
b = np.fromfunction(f, (5, 4), dtype=int)
b

93a7668f04e14cc496205b2fc26ad954.png

b[2, 3]

5e3425c4e851422db600d73c4deec172.png

b[0:5, 1] 

e6d81c9af69b4c3cbe8dfff2b9117f74.png

b[1:3, :]

4503b40e244342bd99ee5c0e08723a53.png

当提供的索引少于轴数时,缺失的索引被视为完整的切片:


b[-1]


2d2420dccaf74bbba3dad619a5b663b7.png

b[i]中括号内的表达式被视为i,后跟表示其余轴所需的:的尽可能多的实例。NumPy还允许使用b[i,…]这样的圆点来写。


点(…)表示生成完整索引元组所需的任意冒号。例如,如果x是一个具有5个轴的数组,则


  • x[1,2,…]等价于x[1,2,:,:,]
  • x[…,3]到x[:,:,::,:3]
  • x[4,…,5,:]到x[4、:、:、5、:]


c = np.array([[[  0,  1,  2],  
               [ 10, 12, 13]],
              [[100, 101, 102],
               [110, 112, 113]]])
c


41009fe5635947cd92a2acfbe308fe9a.png

c[1, ...]

44237ad0f5e84ee9b3b7dddb244f5b85.png


c[..., 2]

28a5cdd4628a4b03b40281943b3cc4e9.png


针对第一个轴对多维数组进行迭代:

for row in b:
    print(row)

5975758e9e5248cebe2f9fa626b19b13.png


但是,如果要对数组中的每个元素执行操作,可以使用flat属性,它是数组所有元素的迭代器:

for element in b.flat:
    print(element)

b7008204bc624f3b802565259a5fc96c.png

目录
相关文章
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
183 0
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
352 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
|
机器学习/深度学习 数据可视化 API
Python Numpy 切片和索引(高级索引、布尔索引、花式索引)
Python Numpy 切片和索引(高级索引、布尔索引、花式索引)
171 3
|
Python
NumPy 教程 之 NumPy 迭代数组 2
本教程介绍NumPy中的迭代数组方法。通过numpy.nditer可灵活访问一个或多个数组元素。示例中,先创建了一个2×3数组并对其进行了迭代输出。此外,还对比展示了数组转置的迭代顺序差异,直观呈现了不同迭代效果。
156 4
|
索引 Python
NumPy 教程 之 NumPy 迭代数组 6
NumPy教程之NumPy迭代数组第6部分。本节介绍NumPy迭代器对象`numpy.nditer`,一种灵活访问一个或多个数组元素的方法。通过示例演示如何利用`external_loop`标志参数遍历多维数组并将其按列组合为一维数组。输出展示了如何通过改变迭代标志实现不同维度数据的灵活访问。
100 3
|
Python
NumPy 教程 之 NumPy 迭代数组 5
本教程详细介绍了NumPy库中的迭代数组方法。NumPy的迭代器对象`numpy.nditer`允许用户灵活地访问一个或多个数组元素。通过使用可选参数`op_flags`,可以在遍历数组的同时修改数组元素的值。示例代码展示了如何将数组`a`的每个元素值翻倍。从输出结果可以看到,原始数组与修改后的数组元素值的变化。
129 3
|
数据安全/隐私保护 Python
NumPy 教程 之 NumPy 迭代数组 3
本教程介绍如何使用NumPy中的迭代器对象`numpy.nditer`来灵活地访问单个多个多数组的元素。通过改变遍历顺序(如 Fortran 或 C 风格),可实现不同场景下的需求。示例中,创建了一个由0至55、步长为5的一维数组,并重塑为3x4矩阵。演示了如何按行优先和列优先顺序遍历数组,输出结果显示了两种遍历方式的不同。
155 3
|
Python
NumPy 教程 之 NumPy 迭代数组 7
NumPy教程之NumPy迭代数组。本教程介绍NumPy中的迭代器对象`numpy.nditer`,它提供了一种灵活高效地访问一个或多个数组元素的方法。通过示例演示了如何利用`numpy.nditer`实现两个数组间的广播迭代:一个3x4矩阵与一个1x4向量相组合,并依次打印出每一个对应元素对。
158 1
|
Python
NumPy 教程 之 NumPy 迭代数组 1
本教程介绍如何使用NumPy中的迭代器对象`numpy.nditer`来访问数组元素。通过示例展示,我们创建了一个2x3的数组,并利用`nditer`对其元素进行了逐个迭代和打印。这是一种灵活且强大的访问及操作数组元素的方法。
97 2
|
C语言 数据安全/隐私保护 Python
NumPy 教程 之 NumPy 迭代数组 4
本教程介绍了如何使用NumPy中的迭代器对象`numpy.nditer`来访问数组元素。通过不同参数设置,您可以控制遍历顺序。例如,`order=&#39;F&#39;`为列优先(Fortran风格),`order=&#39;C&#39;`则为行优先(C语言风格)。下面的示例展示了如何对一个重塑后的数组进行这两种不同顺序的遍历。
136 1