传递元素以高效运行
Passing elements to function efficiently
我有一个大小为 m x n 的数组。
我想将每个 m 行单独传递给一个函数并将结果保存在同一行中。
使用 numpy 执行此操作的有效方法是什么。
目前我正在使用 for 循环来实现这一点:
X : size(m x n)
p : size(m x n)
for i in np.arange(X.shape[0]):
X[i] = some_func(X[i], p[i])
您可以使用列表推导式列出 X 和 p 矩阵的所有第一行,如下所示。然后你可以轻松地将第一行的 X 和 p 作为参数发送到你的 some_function
import numpy as np
X = np.random.randint(9, size=(3, 3))
p = np.random.randint(9, size=(3, 3))
print(X.shape, p.shape)
XList = [i[0] for i in X]
pList = [j[0] for j in p]
print (XList)
print (pList)
for i in np.arange(XList, pList):
X[i] = some_func(XList, pList)
由于您正在修改 X
的行,您可以跳过索引并使用 zip
迭代行:
In [833]: X=np.ones((2,3)); p=np.arange(6).reshape(2,3)
In [834]: for x,y in zip(X,p):
...: x[:] = x + y
...:
In [835]: X
Out[835]:
array([[1., 2., 3.],
[4., 5., 6.]])
如果您仍然需要索引,您可以添加枚举:
for i,(x,y) in enumerate(zip(X,p)):...
这些替代方案的效率没有太大差异。您仍然需要调用函数 m
次。您仍然需要 select 行,无论是通过索引还是通过迭代。两者在数组上都比在等效列表上慢一点。
最好的办法是编写你的函数,使其直接与二维数组一起工作,不需要迭代。
X+p
但如果函数过于复杂,那么它的求值时间可能会比较长(与迭代机制相比)。
我有一个大小为 m x n 的数组。 我想将每个 m 行单独传递给一个函数并将结果保存在同一行中。
使用 numpy 执行此操作的有效方法是什么。 目前我正在使用 for 循环来实现这一点:
X : size(m x n)
p : size(m x n)
for i in np.arange(X.shape[0]):
X[i] = some_func(X[i], p[i])
您可以使用列表推导式列出 X 和 p 矩阵的所有第一行,如下所示。然后你可以轻松地将第一行的 X 和 p 作为参数发送到你的 some_function
import numpy as np
X = np.random.randint(9, size=(3, 3))
p = np.random.randint(9, size=(3, 3))
print(X.shape, p.shape)
XList = [i[0] for i in X]
pList = [j[0] for j in p]
print (XList)
print (pList)
for i in np.arange(XList, pList):
X[i] = some_func(XList, pList)
由于您正在修改 X
的行,您可以跳过索引并使用 zip
迭代行:
In [833]: X=np.ones((2,3)); p=np.arange(6).reshape(2,3)
In [834]: for x,y in zip(X,p):
...: x[:] = x + y
...:
In [835]: X
Out[835]:
array([[1., 2., 3.],
[4., 5., 6.]])
如果您仍然需要索引,您可以添加枚举:
for i,(x,y) in enumerate(zip(X,p)):...
这些替代方案的效率没有太大差异。您仍然需要调用函数 m
次。您仍然需要 select 行,无论是通过索引还是通过迭代。两者在数组上都比在等效列表上慢一点。
最好的办法是编写你的函数,使其直接与二维数组一起工作,不需要迭代。
X+p
但如果函数过于复杂,那么它的求值时间可能会比较长(与迭代机制相比)。