如何在不同形状的ndarray列表上使用numpy.amax()?

时间:2018-02-12 17:54:06

标签: python arrays numpy

我有一个不同形状的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的广播/矢量化功能。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:2)

我会用:

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

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

任何试图挤压+连接数组的尝试(最终只能进行一些numpy max调用)都会导致性能下降。

答案 1 :(得分:0)

l = [(3072, 128), (128, ), (128, 64)]
a = np.array(l, dtype=object)
print np.amax(np.amax(a))
# 3072