如何在 python 中的 2D 数组中加速 2D 数组?
How to speed up 2D arrays in 2D array in python?
我正在研究如何加速我的一项功能。使用多个相同大小的二维数组调用该函数。我想将这些组合成最后两个维度为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 数组传递给函数。
这看起来像是一个简单的堆栈和整形操作:
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()
在数据帧上应该 return 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)
我正在研究如何加速我的一项功能。使用多个相同大小的二维数组调用该函数。我想将这些组合成最后两个维度为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 数组传递给函数。
这看起来像是一个简单的堆栈和整形操作:
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()
在数据帧上应该 return 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)