如何获得在Python/Numpy中获取最大值元素的“n”矩阵的最大方法
问题描述:
嘿,伙计们我想知道获得最大值元素的最佳方法 - n“矩阵在Python/Numpy中。如何获得在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
你会如何解决这个问题?
答
使用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
是可迭代的更新值。如果 可选初始值设定项存在,它将放置在计算中可迭代的项目 之前,并且当可迭代对象 为空时,它将用作默认值。如果初始化程序没有给出并且可迭代只包含一个 项目,则返回第一个项目。
答
import numpy as np
matrices=[np.random.random((5,5)) for i in range(10)]
np.max(np.hstack(matrices))
会给你所有n个矩阵的最大值。这基本上使用np.hstack
将matrices
中的所有矩阵合并到一个数组中,然后获取该新数组的最大值。这假定所有的矩阵都有相同的行数。您也可以使用np.vstack
或np.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
史蒂芬获胜!
+1这非常棒,比Justin或我的答案快一点,特别是对于大型矩阵。 – JoshAdel
这正是我所期待的!感谢你们。 –
我觉得很奇怪,np.maximum.reduce(矩阵)比这慢。我敢打赌,numpy首先使用np.array转换矩阵。 –