迭代 Numpy 矩阵行以分别应用一个函数?
Posted
技术标签:
【中文标题】迭代 Numpy 矩阵行以分别应用一个函数?【英文标题】:Iterating over Numpy matrix rows to apply a function each? 【发布时间】:2013-05-04 08:07:45 【问题描述】:我希望能够遍历矩阵以将函数应用于每一行。我怎样才能为 Numpy 矩阵做到这一点?
【问题讨论】:
如果你解释你想要达到什么/应用什么样的功能,你可能会得到更多有用的答案。另外,您可能想看看:***.com/questions/8079061/… 请发布您的代码。如果您还没有尝试过,请尝试一些东西并发布您遇到的问题 【参考方案1】:您可以使用numpy.apply_along_axis()
。假设你的数组是二维的,你可以像这样使用它:
import numpy as np
mymatrix = np.matrix([[11,12,13],
[21,22,23],
[31,32,33]])
def myfunction(x):
return sum(x)
print(np.apply_along_axis(myfunction, axis=1, arr=mymatrix))
#[36 66 96]
【讨论】:
如果您使用numpy
函数,您可以(通常)只指定轴,例如:mymatrix.sum(axis=1)
。
没错,myfunction 中的 sum() 只是一个示例,但在某些情况下,例如here、np.apply_along_axis()
可能非常有用
可以,是的 - 不知道函数会使问题变得模棱两可。
问题是apply_along_axis
是一个伪装的Python for循环。它可以给人一种 numpy 性能的错觉,但它不会提供它。在您链接的问题中,使用 apply_along_axis
与使用 for 循环相比没有任何好处。尝试向量化你想应用于每一行的任何函数是 numpythonic 做事的方式。【参考方案2】:
如果您想尝试使用多进程来处理 numpy 数组的每一行,这是我的看法,
from multiprocessing import Pool
import numpy as np
def my_function(x):
pass # do something and return something
if __name__ == '__main__':
X = np.arange(6).reshape((3,2))
pool = Pool(processes = 4)
results = pool.map(my_function, map(lambda x: x, X))
pool.close()
pool.join()
pool.map 接受一个函数和一个可迭代对象。 我使用“map”函数在数组的每一行上创建一个迭代器。 不过,也许有更好的方法来创建可迭代对象。
【讨论】:
【参考方案3】:虽然您当然应该提供更多信息,但如果您尝试遍历每一行,您可以使用 for 循环进行迭代:
import numpy
m = numpy.ones((3,5),dtype='int')
for row in m:
print str(row)
【讨论】:
这不是低效的实现吗? @Lokesh,这是为什么呢? @Brendan 已经很晚了,但是在 numpy 数组上循环通常很昂贵,因为每次执行循环时,python 解释器和 numpy 代码都必须交换数据。 @sohnryang,感谢您的回复。在过去,我通过索引(例如for i in range(m)
)对 numpy 数组进行了迭代,并且在我的经验中,直到 100k 次左右的迭代,这并不是性能瓶颈。该线程似乎表明将每一行分配给row
变量可能是缓慢的部分,因此基于索引的迭代可能是这里的方法,而不是变量分配:***.com/questions/39371021/…以上是关于迭代 Numpy 矩阵行以分别应用一个函数?的主要内容,如果未能解决你的问题,请参考以下文章
Python-Numpy中那些通过条件判定(函数迭代运算)去选取元素或重置元素的方法(函数)