numpy:将操作应用于多维数组

时间:2014-01-27 00:25:31

标签: python arrays numpy multidimensional-array

假设我有一个矩阵矩阵,它是一个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解决了问题。

2 个答案:

答案 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运算的函数。