假设我有一个矩阵矩阵,它是一个4阶张量。将相同操作应用于所有子矩阵的最佳方法是什么,类似于Mathematica中的Map?
#!/usr/bin/python3
from pylab import *
t=random( (8,8,4,4) )
#t2=my_map(det,t)
#then shape(t2) becomes (8,8)
修改的
对不起的英语很抱歉,因为它不是我的原住民。
我尝试了numpy.linalg.det
,但它似乎无法很好地应对3D或4D张量:
>>> import numpy as np
>>> a=np.random.rand(8,8,4,4)
>>> np.linalg.det(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/numpy/linalg/linalg.py", line 1703, in det
sign, logdet = slogdet(a)
File "/usr/lib/python3/dist-packages/numpy/linalg/linalg.py", line 1645, in slogdet
_assertRank2(a)
File "/usr/lib/python3/dist-packages/numpy/linalg/linalg.py", line 155, in _assertRank2
'two-dimensional' % len(a.shape))
numpy.linalg.linalg.LinAlgError: 4-dimensional array given. Array must be two-dimensional
EDIT2(已解决)
问题是较旧的numpy版本(&lt; 1.8)不支持numpy.linalg.det
中的内循环,更新到numpy 1.8解决了问题。
答案 0 :(得分:1)
numpy 1.8有一些gufunc可以在C循环中执行此操作:
例如,numpy.linalg.det()
是一个gufunc:
import numpy as np
a = np.random.rand(8,8,4,4)
np.linalg.det(a)
答案 1 :(得分:1)
首先检查文档以了解您要使用的操作。许多人都有办法指定要操作的轴(np.sum
)。其他人指定他们使用的轴(例如np.dot
)。
对于np.linalg.det
,文档包括:
a :( ...,M,M)array_like 输入数组来计算。的决定因素。
所以np.linalg.det(t)
返回(8,8)
数组,使用最后2个维度计算每个det
。
虽然可以迭代维度(第一个是默认值),但最好编写一个使用整个数组的numpy
运算的函数。