迭代 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 矩阵行以分别应用一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

NumPy迭代数组

Python-Numpy中那些通过条件判定(函数迭代运算)去选取元素或重置元素的方法(函数)

在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,

numpy库补充 mean函数应用

Python机器学习(四十八)NumPy 矩阵库函数

使用numpy求解Zoepritz 方程矩阵伪逆时报错: SVD did not converge