【问题标题】:How to avoid the "for" loop in python如何避免python中的“for”循环
【发布时间】:2022-01-04 05:13:56
【问题描述】:

假设 X 是一个形状为 (3,8,8) 的 ndarray,而 y 是另一个形状为 (3,) 的数组。我想将 X 的每个 (8,8) 切片乘以 y 的一个元素,然后将结果相加。使用 for 循环,可以按如下方式完成:

import numpy as np
X = np.random.rand(3,8,8)
y = np.random.rand(3)
temp = 0
for k in range(3):
    temp = temp+y[k]*X[k,:,:]

有什么办法可以避免“for”循环吗?任何线索表示赞赏。

【问题讨论】:

  • While True 使用转义条件迭代?
  • @Skully 我实际上想要一个带有任何循环的矢量化版本。
  • @KellyBundy 请考虑 X 和 y 是随机的。
  • @KellyBundy 我已经编辑了代码。这现在有意义吗?
  • (y[:,None,None]*X).sum(0) 可以解决问题

标签: python numpy for-loop vectorization numpy-ndarray


【解决方案1】:

你有没有花足够的时间阅读 numpy 基础知识来遇到broadcasting

(y[:,None,None]*X).sum(axis=0)

应该可以。

编辑

X 是 (3,8,8)。

y 需要是 (3,1,1) 才能使用它进行广播。

在尝试替换循环时,了解 broadcasting 至关重要。

【讨论】:

  • broadcasting 大约在beginner's 页面的一半处,numpy.org/doc/stable/user/absolute_beginners.html#broadcasting
  • 也许吧!但我不感兴趣。这是犯罪吗?我应该离开这个星球吗?拜托,我很害怕!
  • 别担心纳什!我有多年的 Python 经验,仍在学习广播技巧
  • 是的,广播是 numpy 中一个非常高级的功能……即使您在教程中看到它,您也不会理解如何实现特定案例。不,不是每个人都在从头到尾从官方文档中学习
猜你喜欢
  • 2017-09-20
  • 2017-08-27
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多