【发布时间】:2013-05-04 08:07:45
【问题描述】:
我希望能够遍历矩阵以将函数应用于每一行。我怎样才能为 Numpy 矩阵做到这一点?
【问题讨论】:
-
如果你解释你想要达到什么/应用什么样的功能,你可能会得到更多有用的答案。另外,您可能想看看:stackoverflow.com/questions/8079061/…
-
请发布您的代码。如果您还没有尝试过,请尝试一些东西并发布您遇到的问题
我希望能够遍历矩阵以将函数应用于每一行。我怎样才能为 Numpy 矩阵做到这一点?
【问题讨论】:
您可以使用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)。
np.apply_along_axis() 可能非常有用
apply_along_axis是一个伪装的Python for循环。它可以给人一种 numpy 性能的错觉,但它不会提供它。在您链接的问题中,使用 apply_along_axis 与使用 for 循环相比没有任何好处。尝试向量化你想应用于每一行的任何函数是 numpythonic 做事的方式。
如果您想尝试使用多进程来处理 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”函数在数组的每一行上创建一个迭代器。
不过,也许有更好的方法来创建可迭代对象。
【讨论】:
虽然您当然应该提供更多信息,但如果您尝试遍历每一行,您可以使用 for 循环进行迭代:
import numpy
m = numpy.ones((3,5),dtype='int')
for row in m:
print str(row)
【讨论】:
for i in range(m))对 numpy 数组进行了迭代,并且在我的经验中,直到 100k 次左右的迭代,这并不是性能瓶颈。该线程似乎表明将每一行分配给row 变量可能是缓慢的部分,因此基于索引的迭代可能是这里的方法,而不是变量分配:stackoverflow.com/questions/39371021/…