【问题标题】:Modify list elements whose indices are defined by a list without a for loop修改索引由不带 for 循环的列表定义的列表元素
【发布时间】:2021-12-01 20:34:18
【问题描述】:

我想修改索引由列表定义的列表元素(例如,将它们设为 1)。 一个(错误的)想法可能是:

my_list = [1,2,3,11,22,4]
my_index = [1,3,4]

[my_list[i] = 1 for i in my_index]

总是有蛮力强迫:

for i in my_index:
   my_list[i]  = 1

有没有更有效的方法来做到这一点?有没有办法矢量化这个问题?我还可以从列表中保留不同的元素类型。

【问题讨论】:

  • 您想要使用 python lists 的矢量化解决方案?
  • 不使用纯 python,如果您迫切需要矢量化,numpy 包支持这一点。否则,像您已经在做的那样迭代索引可能会更好。
  • Python 列表推导不会向量化任何东西,它们在性能方面几乎等同于相应的常规 for 循环。

标签: python list for-loop list-comprehension vectorization


【解决方案1】:

“暴力破解”没有什么问题,它可读性强。 有一些方法可以做到这一点,例如可能更快的numpy数组。但是你真的需要更快的速度吗?

【讨论】:

  • 如果您将转换为“np.array”并返回到列表,我怀疑您是否会加快速度。
  • 是的,我希望获得最佳速度,但正如 @MichaelSzczesny 所说,numpy 转换可能会使代码变慢
  • @MichaelSzczesny 不,你不会。我说的是设置数组元素的一般问题,使用 numpy 数组可能更快。在这个玩具示例中,当然没关系。
  • @Siderius - 我用 1e6 元素和 1e5 替换将您的循环解决方案与 numpy 索引进行了基准测试。我得到了(循环 vs numpy):11.3ms vs 7.95ms 不包括转换,11.3ms vs 117ms 包括转换。
  • @Siderius - 不,“排除”只是%timeit my_array[my_index] = 1,使用 numpy 也不是很快。仅包括我得到的第一次转化11.3ms vs 76.2ms
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多