迭代Numpy矩阵行以分别应用函数?

ero*_*gol 44 python numpy matrix

我希望能够迭代矩阵以将函数应用于每一行.我如何为Numpy矩阵做到这一点?

Sau*_*tro 60

使用numpy.apply_along_axis().假设您的矩阵是2D,您可以使用如下:

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]
Run Code Online (Sandbox Code Playgroud)

  • 问题是`apply_along_axis`是伪装的循环Python.它可以给出numpy性能的错觉,但它不会提供它.在您链接的问题中,使用`apply_along_axis`与使用for循环没有任何好处.试图向任何想要应用于每一行的函数进行矢量化是一种简单的做事方式. (21认同)
  • 如果你使用`numpy`函数你可以(通常)只指定轴,如:`mymatrix.sum(axis = 1)`. (8认同)

小智 56

虽然您当然应该提供更多信息,但如果您尝试遍历每一行,则可以使用for循环进行迭代:

import numpy
m = numpy.ones((3,5),dtype='int')
for row in m:
  print str(row)
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个低效的实现吗? (5认同)
  • @Lokesh,那是为什么? (3认同)
  • @Brendan已经很晚了,但是在 numpy 数组上循环通常很昂贵,因为每次执行循环时 python 解释器和 numpy 代码都必须交换数据。 (2认同)
  • @sohryang,感谢您的回复。过去,我通过索引迭代 numpy 数组(例如“for i in range(m)”),根据我的经验,最多 100k 次迭代左右,这并不是性能瓶颈。该线程似乎表明将每一行分配给“row”变量可能是缓慢的部分,因此基于索引的迭代可能是这里的方法,而不是变量分配:/sf/ 39371021/numpy 数组上的高效循环 (2认同)

ham*_*ham 6

如果您想尝试使用多进程来处理 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()
Run Code Online (Sandbox Code Playgroud)

pool.map 接受一个函数和一个可迭代对象。
我使用“map”函数在数组的每一行上创建一个迭代器。
也许有更好的方法来创建可迭代对象。