【发布时间】:2020-12-04 06:47:56
【问题描述】:
我正在研究如何加快我的一项功能。该函数使用多个相同大小的二维数组调用。我想将它们组合成最后两个维度为 3x3 的 4D,然后得到整个数组的特征值。
我已经设法使用两个嵌套的for 循环来做到这一点,但它比我想要的要慢一些,那么有什么好方法可以加快代码速度吗?
def principal(xx, xy, xz, yy, yz, zz):
import numpy as np
xx = np.array(xx)
xy = np.array(xy)
xz = np.array(xz)
yy = np.array(yy)
yz = np.array(yz)
zz = np.array(zz)
size = np.shape(xx)
Princ = np.empty((size[1], size[0], 3, 3))
for j in range(size[1]):
for i in range(size[0]):
Princ[j, i, :, :] = np.array([[xx[i, j], xy[i, j], xz[i, j]],
[xy[i, j], yy[i, j], yz[i, j]],
[xz[i, j], yz[i, j], zz[i, j]]])
Princ = np.linalg.eigvalsh(Princ)
return Princ
import numpy as np
number_arrays_1 = 3
number_arrays_2 = 4
xx = np.ones((number_arrays_1, number_arrays_2))*80
xy = np.ones((number_arrays_1, number_arrays_2))*30
xz = np.ones((number_arrays_1, number_arrays_2))*0
yy = np.ones((number_arrays_1, number_arrays_2))*40
yz = np.ones((number_arrays_1, number_arrays_2))*0
zz = np.ones((number_arrays_1, number_arrays_2))*60
Princ = principal(xx, xy, xz, yy, yz, zz)
print(Princ)
我使用xx = np.array(xx) 进行转换的原因是,在较大的程序中,我将 pandas 数据帧而不是 numpy 数组传递给函数。
【问题讨论】:
-
您正在为每个函数调用导入 numpy 2 次。您应该将它们移动到脚本的顶部
-
我定义的函数主体通常位于一个单独的文件中,然后我将其导入主文件以供使用。我相信我必须导入我定义的每个函数中使用的模块,或者这不是真的吗?
-
@DogukanAltay,额外的导入不是问题。
-
xx等总是np.ones(....)*c吗?还是只是为了这个例子方便? -
只是在这个例子中,它们将是非常不同的,因为它们是模拟输出的。只是为了让我可以看到给出了正确的值(我知道最后评估的特征值是什么)
标签: python arrays performance numpy vectorization