首页 > 编程问答 >双 for 循环的 Pythonic 方式

双 for 循环的 Pythonic 方式

时间:2024-07-26 04:26:14浏览次数:6  
标签:python numpy performance for-loop vectorization

我有以下代码:

import numpy as np
epsilon = np.array([[0.        , 0.00172667, 0.00071437, 0.00091779, 0.00154501],
           [0.00128983, 0.        , 0.00028139, 0.00215905, 0.00094862],
           [0.00035811, 0.00018714, 0.        , 0.00029365, 0.00036993],
           [0.00035631, 0.00112175, 0.00022906, 0.        , 0.00291149],
           [0.00021527, 0.00017653, 0.00010341, 0.00104458, 0.        ]])
Sii = np.array([19998169., 14998140.,  9997923.,  7798321.,  2797958.])
n = len(Sii)

epsilonijSjj = np.zeros((n,n))
for i in range(n):
    for j in range(n):
        epsilonijSjj[i,j] = epsilon[i][j]*Sii[j]

print (epsilonijSjj)

如何避免双重 for 循环并以快速的 Python 方式编写代码?

提前谢谢您


可以在 numpy 中使用向量化操作来避免 for 循环,这会高效得多。numpy 数组能够进行逐元素乘法,这正是所需要的。

import numpy as np

epsilon = np.array([[0.        , 0.00172667, 0.00071437, 0.00091779, 0.00154501],
           [0.00128983, 0.        , 0.00028139, 0.00215905, 0.00094862],
           [0.00035811, 0.00018714, 0.        , 0.00029365, 0.00036993],
           [0.00035631, 0.00112175, 0.00022906, 0.        , 0.00291149],
           [0.00021527, 0.00017653, 0.00010341, 0.00104458, 0.        ]])
Sii = np.array([19998169., 14998140.,  9997923.,  7798321.,  2797958.])

epsilonijSjj = epsilon * Sii[:, None]

print(epsilonijSjj)

在这个解决方案中,我们利用了以下内容:

  1. 广播: 当我们将一个 (5,) 形状的数组 Sii 与一个 (5, 5) 形状的数组 epsilon 相乘时,numpy 会“广播” Sii 以匹配 epsilon 的形状,本质上是将 Sii 复制为 epsilon 中的每一行。
  2. 逐元素乘法: * 运算符对 epsilon 和广播的 Sii 数组执行逐元素乘法,产生所需的输出。

这种方法比使用嵌套循环要快得多,尤其是对于大型数组而言,因为它利用了 numpy 的优化矩阵运算。

标签:python,numpy,performance,for-loop,vectorization
From: 71327868

相关文章

  • 在 matplotlib 中绘制一个字符串函数 // 将 str 解释为 python 代码?
    我正在创建一个RPN计算器,尝试绘制用户给出的函数。例如,如果用户输入"xsin3*plot"我希望它绘制sin(x)*3其代码如下。注意:问题在ifprompt=="plot"userInputX=""#userInputXisalwaysreplacedbefore......
  • Python (Pebble) - 超时功能。当 TimeoutError 发生时,获取从 iterable 传递给函数的值
    我正在尝试在Pebble中设置工作超时(基本上有效)frompebbleimportProcessPoolfrommultiprocessingimportProcess,Pool,cpu_countimporttimedeftest_fn(randomNumberFromList):#print(f'Beginngingforthisnumber:{randomNumberFromList}')ifr......
  • 为什么在 Python 上使用正则表达式组功能会给出不同的输出
    importrestring1="aaabaa"zusuchen="aa"#1m_start=re.finditer(fr'(?=({zusuchen}))',string1)results=[(match.start(1),match.end(1)-1)formatchinm_start]forzinresults:print(z)print("Now#2:"......
  • 如何在python3中找到文件的长度?
    我的第一个.py:defcreate_file(file_name):list=["ab","cd","ef"]foriinlist:withopen(file_name,"a+")asinput_file:print("{}".format(i),file=input_file)我的第二个.py:fromfirstimport......
  • 哪种 python 日志记录风格是推荐的或标准的?
    我是Python新手。介于以下2个选项之间。对于python来说,推荐哪种风格或者更好?logging.info(f"Won'tsavemodelasscoreisbelow0,score:{score}")logging.info("Won'tsavemodelasscoreisbelow0,score%s",score)我个人更喜欢第二种方法。在Python......
  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • Python 获取tiktok视频评论回复数据 api接口
    TIKTOKapi接口爬取tiktok视频评论回复数据详细采集页面如图https://www.tiktok.com/@dailymail/video/7329872821990182190?q=neural%20link&t=1706783508149请求APIhttp://api.xxxx.com/tt/video/info/comment/reply?video_id=7288909913185701125&comment_id=7294900......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • python实现图像特征提取算法1
    python实现Marr-Hildreth算法、Canny边缘检测器算法1.Marr-Hildreth算法详解算法步骤公式Python实现详细解释优缺点2.Canny边缘检测器算法详解算法步骤公式Python实现详细解释优缺点1.Marr-Hildreth算法详解Marr-Hildreth算法是一个......
  • python实现盲反卷积算法
    python实现盲反卷积算法盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成......