【问题标题】:How to use numpy.amax() on list of ndarrays of different shape?如何在不同形状的 ndarray 列表上使用 numpy.amax()?
【发布时间】:2018-02-12 17:54:05
【问题描述】:

我有一个不同形状的 ndarray 列表,例如形状 (3072, 128), (128,), (128, 64)。 前一个数组的最后一个维度与后一个数组的第一个维度匹配并非巧合——如果这有任何帮助的话。 我想使用 numpy 来计算所有数组的整体最大值(所以只有一个标量)。但是,numpy.amax(my_list) 返回

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我知道我可以通过使用明确的for 循环来避免这个问题

for arr in my_list:
    max_so_far = numpy.amax(arr)
    ...

但如果可能的话,我想利用 numpy 的广播/矢量化功能。有没有办法做到这一点?

【问题讨论】:

  • 您不能在列表中使用广播,至少,它不会给您带来任何速度提升。只需使用 for 循环。
  • 将所有数组合并为一个(可能需要展平二维数组),并取最大值。
  • @hpaulj 我怀疑你会在循环中保存任何速度,连接开销会扼杀我怀疑的任何速度提升
  • @hpaulj 确实,我对 max(map(np.max, data))np.concatenate([x.flatten() for x in data]).max() 的快速测试显示后者慢了近 4 倍。
  • @juanpa.arrivillaga,我并不感到惊讶。整个数组解决方案通常不会更快,尤其是在起点是列表的情况下。适量的循环并不是世界上最糟糕的事情。

标签: python arrays numpy


【解决方案1】:

我会使用:

maximum = max(arr.max() for arr in my_list)

在每个 arr.max() 调用中完成最多的工作,这在 numpy 内部得到了很好的优化,并且在单个数组最大值上计算的粘合 Python 最大值的时间可以忽略不计(提供数字数组中的元素个数明显大于数组的总数)。

任何对数组进行挤压+连接的尝试(最终得到一些单一的 numpy max 调用)只会扼杀性能。

【讨论】:

    【解决方案2】:
    l = [(3072, 128), (128, ), (128, 64)]
    a = np.array(l, dtype=object)
    print np.amax(np.amax(a))
    # 3072
    

    【讨论】:

    • 这行不通,这只是因为里面的对象是tuple 对象,但会像上面的np.ndarray 对象一样失败
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 2020-12-04
    • 2018-12-24
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多