Python Numpy基础教程

news2024/11/26 10:24:21

本文是一个关于Python numpy的基础学习教程,其中,Python版本为Python 3.x

什么是Numpy

Numpy = Numerical + Python,它是Python中科学计算的核心库,可以高效的处理多维数组的计算。并且,因为它的许多底层函数是用C语言编写的,所以运算速度敲快。

基础知识

ndarray

NumPy的主要对象是同类型的多维数组ndarray。它是一个通用的同构数据多维容器,所有的元素必须是相同类型的,并通过正整数元组索引。利用该对象可以对整块数据执行一些数学运算,语法和标量元素之间的运算一样。在NumPy中,维度称为轴,轴的数目为rank。

介绍一下ndarray常用的属性:

  1. ndarray.shape:表示各个维度中数组的大小,是一个整数的元组
  2. ndarray.dtype:描述数组中元素类型的对象
  3. ndarray.ndim:数组中轴的个数
  4. ndarray.size:数组元素的总数
  5. ndarray.itemsize:数组中每个元素的字节大小

创建数组

创建数组通常有5种方式:

1. 由Python结构(list, tuple等)转换

创建数组最简单的办法就是使用array对象,它可以接受任何序列型的对象,然后产生一个新的含有传入数据的numpy数组(ndarray)。
举个最简单的例子:

import numpy as np

a = np.array([1, 2, 3])
print(a)
print(a.dtype)
print(a.shape)

2. 使用Numpy原生数组创建(arange, ones,zeros等)

如:

b = np.zeros(10)
c = np.ones((1, 2))

3. 从磁盘读取数组

使用np.load方法读取数据。

4. 使用字符串或缓冲区从原始字节创建数组

5. 使用特殊库函数(random等)

索引和切片

基础操作

一维数组中的索引表面看起来和Python list的功能差不多。

对于切片而言,当你将一个标量值赋值给一个切片时,该值会自动传播到整个选区,跟Python list最重要的区别在于:Numpy中数组的切片作用的是原始数据的视图,也就是数据没有被复制,所有的修改都会直接作用到源数据。这是因为,Numpy设计之初就是为了处理大数据,将数据复制来复制去自然会产生很多性能问题。如果你想要得到一份数据副本,就需要显式的使用.copy()方法。

举个例子:

arr = np.arange(10)
print(arr)
print(arr[0])
print(arr[1:6])
arr_slice = arr[1:6]
arr_slice[1:3] = 5
print(arr_slice)
print(arr)
arr_copy = arr[1:6].copy()
arr_copy[1:3] = 6
print(arr_copy)
print(arr)

对于多维数组,各索引位置上的元素不再是标量,而是数组,可以传入一个以逗号隔开的索引列表来访问单个元素。其它操作和一维数组相同。

举个例子:

arr_2d = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_2d[0])
print(arr_2d[0, 1])
arr_2d_slice = arr_2d[1]
print(arr_2d_slice)
arr_2d_slice[0] = 1
print(arr_2d_slice)
print(arr_2d)

切片索引

ndarray的切片语法和Python list类似,对于高维对象,花样比较多,可以在一个或者多个轴进行切片,也可以跟整数索引混合使用(降低维度)。

举个例子:

arr_test = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5]])
print(arr_test[:2])
print(arr_test[:2, 1:])
print(arr_test[1, :1])
arr_slice_test = arr_test[:2, 1:]
arr_slice_test[0] = 0
print( arr_slice_test)
print(arr_test)

布尔型索引

通过布尔型索引,可以方便我们根据指定条件快速的检索数组中的元素。如果进行变量或者标定量的大数据处理,这种筛选功能的使用肯定会给程序的设计带来极大的便捷。

举个简单例子:

In [1]: import numpy as np
In [2]: x = np.array([[0, 1], [2, 3], [3, 4]])
In [3]: x
Out[3]:
array([[0, 1],
       [2, 3],
       [3, 4]])
In [4]: x > 2
Out[4]:
array([[False, False],
       [False,  True],
       [ True,  True]])
In [5]: x[ x > 2] = 0
In [6]: x
Out[6]:
array([[0, 1],
       [2, 0],
       [0, 0]])

并且,可以结合使用ndarray的统计方法来对布尔型数组中的True值进行计数,常见有三种方法:

  1. sum():对True值进行计数
  2. any():测试数组中是否存在一个或者多个True
  3. all():检查数组中的所有值是否都是True

花式索引

花式索引(Fancy indexing)是一个Numpy的术语,指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

举个例子:

In [1]: import numpy as np

In [2]: array = np.empty((4, 3))

In [3]: for i in range(4):
   ...:     array[i] = i
   ...:

In [4]: array
Out[4]:
array([[0., 0., 0.],
       [1., 1., 1.],
       [2., 2., 2.],
       [3., 3., 3.]])

In [5]: array[[1, 3]]
Out[5]:
array([[1., 1., 1.],
       [3., 3., 3.]])

In [6]: array[[-1, -3]]
Out[6]:
array([[3., 3., 3.],
       [1., 1., 1.]])

In [7]: array[np.ix_([3, 0],[2, 1])]
Out[7]:
array([[3., 3.],
       [0., 0.]])

形状操作

形状转换

介绍几个常见的修改数组形状的方法:

  1. reshape():不改变原始数据的情况下修改数组

  2. flat():一个数组元素的迭代器,可以处理数组元素中的每个数据

  3. flatten():返回一份数组拷贝,对拷贝所做的处理不会影响原始数组,格式为.flatten(order=''),其中order='C'表示按行展开,'F'表示按列,'A'表示原顺序,'K'表示元素在内存中的出现顺序。

  4. ravel():展平的数组元素,顺序通常是"C风格",返回的是数组视图,修改会影响原始数组。

    该函数接收两个参数:

举个例子:

arr = np.arange(12)
print(arr)
arr1 = arr.reshape(3, 4)

for item in arr1:
    print(item)
for item in arr1.flat:
    print(item)

print(arr1.flatten())
print(arr1.flatten(order="K"))
arr.flatten()[10] = 0
print(arr)

print(arr.ravel())
arr.ravel()[10] = 0
print(arr)

转置与轴对换

介绍常见的几种方法:

  1. ndarray.T:转置
  2. transpose: 对换数组的维数
  3. rollaxis: 向后滚动指定的轴
  4. swapaxes:用于交换数组的两个轴

转置是数据重塑的一种特殊形式,返回了源数据的视图。简单的转置可以使用.T,也可以使用transpose方法和swapaxes。

举个例子:

arr = np.arange(12).reshape((2, 2, 3))
print(arr)
print(arr.T)
print(arr.transpose((1, 0, 2)))
print(arr.swapaxes(1, 2))

通用函数:快速的元素级数组函数

通用函数(ufunc)是一种对ndarray中的数据执行元素级运算的函数,可将其分为一元和二元进行说明。

一元func

一元func可看做是简单的元素级变体,比如sqrt和cos,举个例子:

arr = np.arange(10)
print(np.sqrt(arr))
print(np.square(arr))

二元func

接受2个数组,然后返回一个结果数组,比如add和mod,举个例子:

arr1 = np.arange(10)
arr2 = np.arange(10)
print(np.add(arr1, arr2))

更多函数去官方文档查阅,哈哈,这里就不赘述了。

数组运算

基础运算

在Numpy中,可以利用ndarray对整块数据执行一些数学运算,语法和普通的标量元素之间的运算一样。其中,数组与标量的运算会将标量作用于各个数组元素。

举个例子:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])
print(i + j)
print(i - j)
print(i - 1)
print(i * j)
print( i / j)

以上,乘法并不同于矩阵乘法,若需进行矩阵相乘,可使用:

i = np.array([[1, 2], [3, 4]])
j = np.array([[5, 6], [7, 8]])

print(j.dot(i))

除此之外,Numpy还提供了以下常用统计方法:

  1. min():数组最小值
  2. max():数组最大值
  3. sum():数组元素相加
  4. cumsum():计算轴向元素累加和,返回由中间结果组成的数组
  5. cumprod():所有元素的累计积

数组表达式

编写数组表达式处理多个数组数据也是很便捷高效的,举个例子:假设我们想要在一组值(网格型)上计算函数sqrt(x^2 + y^2),使用np.mashgrid函数接受两个一维数组,产生两个二维矩阵:

In [1]: import numpy as np

In [2]: points = np.arange(-5, 5, 0.01)

In [3]: x, y = np.meshgrid(points, points)

In [4]: x
Out[4]:
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       ...,
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
       [-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])

In [5]: z = np.sqrt(x ** 2 + y ** 2)

In [6]: z
Out[6]:
array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,
        7.06400028],
       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
        7.05692568],
       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
        7.04985815],
       ...,
       [7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,
        7.04279774],
       [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
        7.04985815],
       [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
        7.05692568]])

条件筛选

介绍几个常见的筛选方法:

  1. where:返回输入数组中满足给定条件的元素的索引
  2. .argmax() 和 numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引
  3. nonzero() 函数返回输入数组中非零元素的索引。

实例

接下来,使用Numpy来模拟随机漫步操作下数组运算。

首先,实现一个很简单的1000步的随机漫步,从0开始,随机生成1和-1,判断随机漫步过程中第一次到达某个值(暂定为8)的时间(步数),实现:

import numpy as np
nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
# 各步的累计和
walk = steps.cumsum()
# 第一次到达8的时间
walk_8 = (np.abs(walk) >= 8).argmax()
print(walk_8)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518

TC358775XBG替代方案|完美替代 TC358775XBG替代方案|低BOM成本DSI转LVDS方案CS5518 TC358775XBG芯片的主要功能是DSI到LVDS桥,通过DSI链路实现视频流输出,以驱动LVDS兼容的显示面板。该芯片支持单链路LVDS高达1366768 24位像素分辨率,双链路L…

了解webpack

文章目录一、webpack是什么?二、为什么要使用webpack三、webpack的五个核心概念四、安装webpack提示:以下是本篇文章正文内容,下面案例可供参考 一、webpack是什么? 本质上,webpack 是一个用于现代 JavaScript 应用程…

PyTorch学习笔记:nn.MSELoss——MSE损失

PyTorch学习笔记:nn.MSELoss——MSE损失 torch.nn.MSELoss(size_average None,reduce None,reduction mean)功能:创建一个平方误差(MSE)损失函数,又称为L2损失: l(x,y)L{l1,…,lN}T,ln(xn−yn)2l(x,y)L…

设计模式:建造者模式教你创建复杂对象

一、问题场景 当我们需要创建资源池配置对象的时候&#xff0c;资源池配置类里面有以下成员变量: 如果我们使用new关键字调用构造函数&#xff0c;构造函数参数列表就会太长。 如果我们使用set方法设置字段值&#xff0c;那minIdle<maxIdle<maxTotal的约束逻辑就没地方…

【计组】内存和总线

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、虚拟内存和内存保护 日常使用的操作系统下&#xff0c;程序不能直接访问物理内存。内存需要被分成固定大小的页&#xff08;Page&#xff09;&#xff0c;再通过虚拟内存地址&#xff08;Virtu…

如何创建一个有效的FAQ/常见问题解答页面?

如果您的网站上没有常见问题解答页面&#xff0c;那么您将错过本可以节省的数小时的销售和支持时间&#xff0c;以及本可以推动购买的新客户。尽管与登录页面或销售页面不同&#xff0c;常见问题解答页面显然不会显示直接的投资回报&#xff0c;但它可以在其他因素上节省您的团…

内网渗透(十五)之内网信息收集-域环境中定位域管理员

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

多路查找树

1.二叉树与 B 树 1.1二叉树的问题分析 二叉树的操作效率较高&#xff0c;但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的&#xff0c;如果二叉树的节点少&#xff0c;没有什么问题&#xff0c;但是如果二叉树的节点很多(比如 1 亿)&#xff0c; 就 存在如下问题:问…

洞察:2022年医疗行业数据安全回顾及2023年展望

过去的2022年&#xff0c;统筹安全与发展&#xff0c;在医疗信息化发展道路中&#xff0c;数据安全不可或缺。这一年&#xff0c;实施五年多的《网络安全法》迎来首次修改&#xff0c;《数据安全法》、《个人信息保护法》实施一周年&#xff0c;配套的《数据出境安全评估办法》…

用户标签体系建设

一、什么是标签体系 通过给每个用户打标&#xff0c;方便后续通过用户标签来快速筛选用户&#xff0c;给不同的用户满足不一样的需求。 标签体系也能给不同的用户标签群体&#xff0c;推送不同的内容&#xff0c;从而达到精准营销的目的。 二、标签体系实施架构 标签体系架…

盾王电力防护、森林防火预警应急广播方案

适用场景&#xff1a;针对普通路人与进入有涉电危险的区域人员作区别预警&#xff1b;三重音频、广告牌子宣传、LED显示、视频监控、预警干预。主要功能 第一重预警&#xff1a;对岸边上的行人&#xff0c;当你进入有涉电危险的警戒12米范围内。人体感应器探测到会马上发出语音…

光纤、光模块、光纤交换机、光模块组网设计与案例

光纤组网已是当今智能化弱电行业里一种常见的组网方式&#xff0c;组建远距离无线、监控网络时&#xff0c;往往需要使用光纤进行连接通信&#xff0c;使用光纤收发器是经济适用型做法&#xff0c;尤其是在室外的使用。其实光纤收发器不仅可以成对使用&#xff0c;还可以配合光…

ESP-IDF:在客户端网页上实现拍照按钮功能,并跳转新页面显示图片

ESP-IDF:在客户网页上实现拍照按钮功能&#xff0c;并跳转新页面显示图片 核心代码&#xff1a; /* Send response with custom headers and body set as the* string passed in user context*/ //const char* resp_str (const char*) req->user_ctx; const char *resp_s…

MASA Stack 1.0 发布会讲稿——实践篇

MASA Stack 1.0 实践篇 产品智能化 产品智能化的改造怎么做&#xff1f; 我们以采用运营商网络场景的物联网架构举例&#xff0c;如图从左到右&#xff0c;在设备端我们研发了一款净水行业通用的物联网盒子&#xff0c;它带有各种传感器&#xff0c;如TDS、温度、流量、漏水检…

80%的代码AI帮你写?还没这么夸张,不过也快了

兔年春节一过&#xff0c;APIcat进入到云服务版本的开发阶段&#xff0c;过年前发生了一件大事&#xff0c;Chatgpt横空出世&#xff0c;不少人预测Chatgpt会替代的10大行业&#xff0c;其中就有程序员。 这时&#xff0c;一位特斯拉的老哥出来说&#xff0c;GitHub Copilot帮…

Redis简介

Redis是一款开源的、高性能的键-值存储&#xff08;key-value store&#xff09;。它常被称作是一款数据结构服务器&#xff08;data structure server&#xff09;。 Redis的键值可以包括字符串&#xff08;strings&#xff09;类型&#xff0c;同时它还包括哈希&#xff08;h…

Netty 中的 Channel执行完close之后, 还能进行write吗?

问题来源&#xff1a;项目中出现顶号操作的时候&#xff0c;正常情况下被顶掉的连接应该收到一个 “同一账号登录&#xff0c;请退出重登” 的错误消息&#xff0c; 但是偶现客户端接收不到消息的情况&#xff08;连接实际上已经被服务器干掉了&#xff0c;客户端就呆呆的&…

word和wps添加mathtype选项卡

word或wps添加mathtype选项卡 前提 安装好word或wps安装好mathtype 步骤 确认word或wps具体安装位置确认word或wps位数为32位还是64位复制mathtype中的MathPage.wll文件和MathType Commands 2016.dotm文件到STARTUP位置添加受信任位置添加加载项 安装位置 通过开始页面&a…

三套大厂网络安全工程师面试题(附答案解析)冲刺金三银四

2023年已经开始了&#xff0c;先来灵魂三连问&#xff0c;年初定的目标是多少&#xff1f;薪资能涨吗&#xff1f;女朋友能找到吗&#xff1f; 好了&#xff0c;不扎大家的心了&#xff0c;接下来进入正文。 由于我之前写了不少网络安全技术相关的文章和回答&#xff0c;不少…

亿级高并发电商项目---万达商城项目搭建(二)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…