如何在python的2D数组中加速2D数组?

2024-04-27 11:05:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究如何加速我的一个函数。该函数由许多大小相同的二维数组调用。我想把它们组合成一个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)进行转换的原因是,在较大的程序中,我将一个数据帧而不是numpy数组传递到函数中


Tags: 函数numbersizenpones数组arrayxy
1条回答
网友
1楼 · 发布于 2024-04-27 11:05:30

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

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^数据帧上的{}应返回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)

相关问题 更多 >