gpt4 book ai didi

python - 如何在 python 中的二维数组中加速二维数组?

转载 作者:行者123 更新时间:2023-12-04 15:20:36 25 4
gpt4 key购买 nike

我正在研究如何加速我的一项功能。使用多个相同大小的二维数组调用该函数。我想把它们组合成一个 4D 和最后两个维度的 3x3,然后得到整个数组的特征值。

我已经设法使用两个嵌套的 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 数组传递给函数。

最佳答案

这看起来像是一个简单的堆栈和 reshape 操作:

def principal(xx, xy, xz, yy, yz, zz):
princ = np.stack((xx.T, xy.T, xz.T, xy.T, yy.T, yz.T, xz.T, yz.T, zz.T), axis=-1).reshape(*xx.shape[::-1], 3, 3)
return = np.linalg.eigvalsh(princ)

如果输入已经是数组,则无需显式调用 np.array。数据帧上的 xx.values() 应该返回 numpy 值。

另一种方法是构建数组,然后将 3x3 维度换出到后面。这可能会降低效率,因为第一种方法使 3x3 维度连续,而这种方法不是:

princ = np.array([[xx, xy, xz], [xy, yy, yz], [xz, yz, zz]]).T

不是很相关,但是您可以像这样更快地生成数组:

target_shape = (3, 4)
values = np.array([80, 30, 0, 40, 0, 60])
xx, xy, xz, yy, yz, zz = np.full((6, *target_shape), values.reshape(-1, 1, 1))

事实上,如果您的数据允许,您甚至可以节省解包时间:

data = np.full((6, *target_shape), values.reshape(-1, 1, 1))
principal(*data)

关于python - 如何在 python 中的二维数组中加速二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63411778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com