【问题标题】:numpy where with different sizesnumpy where 有不同的大小
【发布时间】:2020-07-04 19:20:04
【问题描述】:

我有一个 for 循环需要 1 个多小时才能执行,所以我有了使用 numpy.where() 函数的想法。 我想知道是否有任何方法可以在具有不同子列表大小的数组中使用 numpy where ,如下例所示:

a = [[1,2,3],[4,5]]
a = np.array(a)
print(np.where(a < 3, -1, 100))

输出:

 File "test.py", line 104, in <module>
        print(np.where(a < 3, -1, 100))
   TypeError: '<' not supported between instances of 'list' and 'int'

非常感谢!

【问题讨论】:

  • 重点是您定义的数组a 不统一,因此被视为列表。您可能希望使其统一以使其工作,否则您将无法获得 numpy 的好处。
  • 感谢您的回答!你说的制服到底是什么意思?你的意思是这样的[[1,2,3],[4,5,6]]?如果是,我不能使用不同的列表大小?
  • 事实上我有一个带有子数组的数组,每个子数组都有一个图像的像素并且这些图像没有相同的形状,所以数组的大小可能会有所不同你知道怎么做吗?在这种情况下我使用 where ?
  • 您好,Wassim,我为您回答了这个具体案例。但是,如果您提供有关代码的更多详细信息,我相信您会得到很多关于如何加快代码速度的有趣想法。
  • 作为 python 参数的条件在传递给 where 之前会被完整评估。 where 是一个函数,不是特殊的语法操作。

标签: python numpy numpy-ndarray


【解决方案1】:

你可以做一个列表解析,它应该比 FOR 循环更快:

import numpy as np

a = [[1,2,3],[4,5]]
print([list(np.where(np.array(x) < 3, -1, 100)) for x in a])

输出:

[[-1, -1, 100], [100, 100]]

【讨论】:

  • 您好,感谢您的回答!那是个好主意,我会尝试的,但我认为这需要很长时间。事实上,我有一个带有子数组的数组,每个子数组都有一个图像的像素,而这些图像的形状不同,所以子数组的大小可能会有所不同你知道我怎么能在这个位置使用案例?
  • 这在很大程度上取决于您对这些图像执行的操作,也许您可​​以在问题中添加您对每个图像执行哪些操作。如果您正在进行图像处理,我认为不是这个循环会减慢处理速度。可能是您对每个图像应用的处理需要时间。
  • 我用一些输入权重替换一些像素,例如 [[1,10,5],[1,6,7]...] 我需要用值替换所有出现的 10 99 和所有出现的 6 和 98
  • 根据我的经验,列表理解只会适度提高速度,尤其是在循环动作复杂的情况下
  • @hpaulj 是的,你是对的。但是,不知道原来耗时一个多小时的版本是怎么实现的。当然,列表理解可以适度提高速度,而不是实现循环。
猜你喜欢
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多