Wolfram mathematica 导出张量内值的平均值

Wolfram mathematica 导出张量内值的平均值,wolfram-mathematica,Wolfram Mathematica,我有一个20000 x 185 x 5张量,看起来像 {{{a1_1,a2_1,a3_1,a4_1,a5_1},{b1_1,b2_1,b3_1,b4_1,b5_1}... (continue for 185 times)} {{a1_2,a2_2,a3_2,a4_2,a5_2},{b1_2,b2_2,b3_2,b4_2,b5_2}... ... ... ... {{a1_20000,a2_20000,a3_20000,a4_20000,a5_20000}, {b1_200

我有一个
20000 x 185 x 5
张量,看起来像

{{{a1_1,a2_1,a3_1,a4_1,a5_1},{b1_1,b2_1,b3_1,b4_1,b5_1}... 
(continue for 185 times)}
 {{a1_2,a2_2,a3_2,a4_2,a5_2},{b1_2,b2_2,b3_2,b4_2,b5_2}...

 ...    
 ... 
 ...

{{a1_20000,a2_20000,a3_20000,a4_20000,a5_20000},
{b1_20000,b2_20000,b3_20000,b4_20000,b5_20000}... }}
20000代表迭代次数,185代表个体,每个个体有5个属性。我需要构造一个
185x5
矩阵,存储每个个体的5个属性的平均值,在20000次迭代中求平均值


不知道最好的方法是什么。我知道
Mean[]
适用于矩阵,但对于张量,导出的值可能不是我需要的。此外,如果我尝试做平均值[张量],Mathematica的内存就会耗尽。请提供一些帮助或建议。谢谢。

如有疑问,请降低尺寸。(您仍然可以将它们区分开来,以便轻松看到事情的结局。)


我不知道你做错了什么(你的代码会有帮助)。但是
Mean[]
已经按照您的要求工作了

a = RandomReal[1, {20000, 185, 5}];
b = Mean@a;

Dimensions@b
Out[1]= {185, 5}
您甚至可以检查这是否正确:

{Max@b, Min@b}
Out[2]={0.506445, 0.494061}

这是平均值的预期值,因为默认情况下,
RandomReal
使用均匀分布。

假设您有以下数据:

a=Table[RandomInteger[100],{i,20000},{j,185},{k,5}]

以简单的方式,您可以找到一个表,其中存储了
a[[1,j,k]]、a[[2,j,k]]、…a[[20000,j,k]].

c = Table[Sum[a[[i, j, k]], {i, Length[a]}], {j, 185}, {k, 5}]/
 Length[a] // N; // Timing
{37.487, Null}
或者简单地说:

d = Total[a]/Length[a] // N; // Timing
{0.702, Null}
第二种方法大约快50倍

c == d
True

为了详细说明其他答案,没有理由期望Mathematica函数在张量和矩阵上的操作有实质性的不同,因为Mathemetica认为它们都是嵌套的
List
s,只是嵌套深度不同。函数在列表中的行为取决于它们是否可列表,您可以使用
Attributes[f]
进行检查,其中
f
是您感兴趣的函数

事实上,你的数据列表的维度在整个计划中并没有那么大。如果看不到实际数据,很难确定,但我怀疑内存不足的原因是某些数据不是数字

如果我试着做平均[张量]的话,Mathematica的内存就用完了

这可能是因为中间结果大于最终结果。如果元素的类型不是Real或Integer,则可能会出现这种情况。例如:

a = Tuples[{x, Sqrt[y], z^x, q/2, Mod[r, 1], Sin[s]}, {2, 4}];
{MemoryInUse[], MaxMemoryUsed[]}
b = Mean[a];
{MemoryInUse[], MaxMemoryUsed[]}
真的 {163010680, 458982088}
{163122608,786958080}对Brett的答案进行一点扩展,当你调用n维张量的
Mean
时,它对第一个索引进行平均,并返回n维张量:

a = RandomReal[1, {a1, a2, a3, ... an}];
Dimensions[a] (* This would have n entries in it *)
b = Mean[a];
Dimensions[b] (* Has n-1 entries, where averaging was done over the first index *)
在更一般的情况下,您可能希望对第i个参数进行平均,您必须先将数据转置。例如,假设您想要平均5维的第3维。首先需要第三个元素,然后是第1、第2、第4、第5个元素

a = RandomReal[1, {5, 10, 2, 40, 10}];
b = Transpose[a, {2, 3, 4, 1, 5}];
c = Mean[b]; (* Now of dimensions {5, 10, 40, 10} *)
换句话说,您可以调用
Transpose
,将第i个索引作为第一个张量索引,并将其前面的所有内容向前移动一个。第i个索引之后的任何内容都保持不变

当您的数据以奇数格式出现时,这往往很有用,因为第一个索引可能并不总是表示数据样本的不同实现。举个例子,当我不得不对大型风数据集进行时间平均时,时间序列在可用的张量表示中排名第三(!)

您可以想象,
generalizedTenorMean
会像这样:

Clear[generalizedTensorMean];
generalizedTensorMean[A_, i_] := 
 Module[{n = Length@Dimensions@A, ordering},
  ordering = 
   Join[Table[x, {x, 2, i}], {1}, Table[x, {x, i + 1, n}]];
  Mean@Transpose[A, ordering]]
i==1
时,这将降低为普通的旧平均值。试一试:

A = RandomReal[1, {2, 4, 6, 8, 10, 12, 14}];
Dimensions@A   (* {2, 4, 6, 8, 10, 12, 14} *)
Dimensions@generalizedTensorMean[A, 1]  (* {4, 6, 8, 10, 12, 14} *)
Dimensions@generalizedTensorMean[A, 7]  (* {2, 4, 6, 8, 10, 12} *)

另一方面,我很惊讶Mathematica在默认情况下不支持这一点。您并不总是希望对列表的第一级进行平均。

(1)设置代码格式。(2) 提供您的解决方案,这可能不是最佳的,但我们会改进它。感谢您的评论和格式。我是stackoverflow的新手,下次我会对我的帖子进行更多的格式化。你的张量中的所有元素都是数字吗?如果不是,它可以解释为什么你的内存不足。20000乘185乘5在Mathematica的方案中不是那么大谢谢Brett。我算出了平均值[张量]的作用。为了让我的程序运行这个操作,我不得不减少迭代次数。是的,的确如此。早些时候,我自己用一小部分数据进行了测试,结果成功了。是的,但在张量的适当深度上,肯定
Map
ping
Mean
更有效,并教用户更有效地使用Mathematica中的函数编程风格?一开始,过程方法也很方便。 True {163012808, 163016952} {163018944, 163026688}
a = RandomReal[$MaxMachineNumber, {20000, 185, 5}];
Developer`PackedArrayQ[a]
{MemoryInUse[], MaxMemoryUsed[]}
b = Mean[a];
{MemoryInUse[], MaxMemoryUsed[]}
True {163010680, 458982088} {163122608, 786958080}
a = RandomReal[1, {a1, a2, a3, ... an}];
Dimensions[a] (* This would have n entries in it *)
b = Mean[a];
Dimensions[b] (* Has n-1 entries, where averaging was done over the first index *)
a = RandomReal[1, {5, 10, 2, 40, 10}];
b = Transpose[a, {2, 3, 4, 1, 5}];
c = Mean[b]; (* Now of dimensions {5, 10, 40, 10} *)
Clear[generalizedTensorMean];
generalizedTensorMean[A_, i_] := 
 Module[{n = Length@Dimensions@A, ordering},
  ordering = 
   Join[Table[x, {x, 2, i}], {1}, Table[x, {x, i + 1, n}]];
  Mean@Transpose[A, ordering]]
A = RandomReal[1, {2, 4, 6, 8, 10, 12, 14}];
Dimensions@A   (* {2, 4, 6, 8, 10, 12, 14} *)
Dimensions@generalizedTensorMean[A, 1]  (* {4, 6, 8, 10, 12, 14} *)
Dimensions@generalizedTensorMean[A, 7]  (* {2, 4, 6, 8, 10, 12} *)