【发布时间】: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,我并不感到惊讶。整个数组解决方案通常不会更快,尤其是在起点是列表的情况下。适量的循环并不是世界上最糟糕的事情。