【问题标题】:How to get the fatest way of getting the maximum values element-wised of "n" matrices in Python/Numpy?如何在 Python/Numpy 中以最快的方式获取“n”矩阵的最大值元素?
【发布时间】:2011-09-30 17:45:47
【问题描述】:

我想知道在 Python/Numpy 中获取“n”个矩阵的最大值的最佳方法/优化方法。

例如:

import numpy as np
matrices=[np.random.random((5,5)) for i in range(10)]
# the function np.maximum from numpy only works for two matrices.
max_matrix=np.maximum(matrices[0],matrices[1])
max_matrix=np.maximum(*matrices) # <- error

你将如何克服这个问题?

【问题讨论】:

    标签: python performance matrix numpy max


    【解决方案1】:

    使用reduce:

    reduce(np.maximum, matrices)
    

    来自docs

    reduce(函数, 可迭代[, 初始化器])

    将两个参数的函数累积应用于可迭代项, 从左到右,从而将可迭代减少为单个值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 计算 ((((1+2)+3)+4)+5)。左边的参数,x,是累加值和 正确的参数y 是来自可迭代对象的更新值。如果 可选初始化器存在,它被放置在项目之前 在计算中可迭代,并在可迭代时用作默认值 是空的。如果没有给出初始化程序并且可迭代只包含一个 item,返回第一个 item。

    【讨论】:

    • +1 这太棒了,比 Justin 或我的答案都快一点,尤其是对于大型矩阵。
    • 这正是我想要的!谢谢你们。
    • 我觉得奇怪的是 np.maximum.reduce(matrices) 比这慢。我敢打赌,numpy 首先使用 np.array 转换矩阵。
    【解决方案2】:
    import numpy as np
    matrices=[np.random.random((5,5)) for i in range(10)]
    np.max(np.hstack(matrices))
    

    将为您提供所有 n 个矩阵的最大值。这基本上使用np.hstackmatrices 中的所有矩阵合并到一个数组中,然后取该新数组的最大值。这假设您的所有矩阵都具有相同的行数。您也可以使用np.vstacknp.concatenate 来达到类似的效果。

    编辑我重新阅读了您的问题,您实际上可能想要更多类似的东西:

    np.max(np.dstack(matrices),axis=2)
    

    这将沿第三个轴堆叠所有矩阵,然后沿该方向为您提供最大值,为您的情况返回一个 5x5 矩阵。

    编辑#2以下是一些时间安排:

    In [33]: matrices = [np.random.random((5,5)) for i in range(10)]
    
    In [34]: %timeit np.dstack(matrices).max(2)
    10000 loops, best of 3: 92.6 us per loop
    
    In [35]: %timeit np.array(matrices).max(axis=0)
    10000 loops, best of 3: 90.9 us per loop
    
    In [36]: %timeit reduce(np.maximum, matrices)
    10000 loops, best of 3: 25.8 us per loop
    

    对于一些更大的数组:

    In [37]: matrices = [np.random.random((200,200)) for i in range(100)]
    
    In [38]: %timeit np.dstack(matrices).max(2)
    10 loops, best of 3: 111 ms per loop
    
    In [39]: %timeit np.array(matrices).max(axis=0)
    1 loops, best of 3: 697 ms per loop
    
    In [40]: %timeit reduce(np.maximum, matrices)
    100 loops, best of 3: 12.7 ms per loop
    

    史蒂文赢了!

    【讨论】:

    • OP 想要一个输出矩阵,其中每个元素都是输入矩阵中位于同一位置的所有元素的最大值。
    • 在我看到你的评论之前修复它
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2021-12-17
    相关资源
    最近更新 更多