【发布时间】:2018-09-16 08:51:35
【问题描述】:
我是 numpy 的新手,但作为一名工程师,我使用 python 已经有一段时间了。 我正在编写一个程序,该程序当前将应力张量存储为另一个 NxM 数组中的 3x3 numpy 数组,该数组表示通过时间和墙壁厚度的值,所以总的来说它是一个 NxMx3x3 numpy 数组。我想有效地计算这个更大数组中每个 3x3 数组的特征值和向量。到目前为止,我已经尝试使用“fromiter”,但这似乎不起作用,因为函数返回 2 个数组。我也试过 apply_along_axis 也不起作用,因为它说内部 3x3 不是方阵?我可以通过列表理解来做到这一点,但这似乎并不适合使用列表。
使用列表推导计算特征值的示例
import numpy as np
from scipy import linalg
a=np.random.random((2,2,3,3))
f=linalg.eigvalsh
ans=np.asarray([f(x) for x in a.reshape((4,3,3))])
ans.shape=(2,2,3)
我认为这样的东西会起作用,但我已经玩过它并且无法让它起作用:
np.apply_along_axis(f,0,a)
顺便说一句,2x2 位可能高达 5000x100,并且此代码重复了 ~50x50x200 次,因此需要提高效率。任何帮助将不胜感激?
【问题讨论】:
-
列表理解有效吗?你不会得到更快或更简单的东西,
-
它确实有效,我只是在想会有一种更 numpyish 的方式来保持它作为 numpy 数组。但如果不是,我会忍受它。
-
像
apply_along_axis这样的函数是便利函数。它们使某些操作更容易,但不会更快。您可以通过将数组重新整形为 (N,M,9) 并将eigvalsh包装在将 (9,) 输入重新整形为 (3,3) 的函数中来使其工作。但是eigvalsh仍然会为每个 N*M 数组调用一次。 -
(3,3)s 对称吗?他们不在你的例子中。该功能需要什么?