gpt4 book ai didi

wolfram-mathematica - 转换嵌套列表而不复制或丢失精度

转载 作者:行者123 更新时间:2023-12-04 08:03:56 26 4
gpt4 key购买 nike

我正在使用 Mathematica 7 处理大型数据集。数据集是一个有符号整数的三维数组。可以认为这三个级别对应于每次拍摄 X 点、每次扫描 Y 拍摄和每组 Z 扫描。

我还有一个“归零”镜头(包含 X 点,它们是整数的有符号分数),我想从数据集中的每个镜头中减去它。之后,我将不再需要原始数据集。

如何在不创建数据集或部分数据集的新副本的情况下执行此转换?从概念上讲,数据集位于内存中,我想扫描每个元素,并在内存中的那个位置更改它,而不是将它永久复制到其他内存位置。

以下自包含代码捕获了我正在尝试做的所有方面:

(* Create some offsetted data, and a zero data set. *)
myData = Table[Table[Table[RandomInteger[{1, 100}], {k, 500}], {j, 400}], {i, 200}];
myZero = Table[RandomInteger[{1, 9}]/RandomInteger[{1, 9}] + 50, {i, 500}];

(* Method 1 *)
myData = Table[
f1 = myData[[i]];
Table[
f2 = f1[[j]];
f2 - myZero, {j, 400}], {i, 200}];

(* Method 2 *)
Do[
Do[
myData[[i]][[j]] = myData[[i]][[j]] - myZero, {j, 400}], {i, 200}]

(* Method 3 *)
Attributes[Zeroing] = {HoldFirst};
Zeroing[x_] := Module[{},
Do[
Do[
x[[i]][[j]] = x[[i]][[j]] - myZero, {j, Length[x[[1]]]}
], {i, Length[x]}
]
];

(注意:方法#3 的帽子提示 Aaron Honecker。)

在我的机器上(Intel Core2 Duo CPU 3.17 GHz,4 GB RAM,32 位 Windows 7),所有三种方法都使用大约 1.25 GB 的内存,#2 和 #3 的整流罩稍好一些。

如果我不介意失去精度,包装 N[ ] myData 的内脏周围和 myZero当它们被创建时,它们在内存中的大小最初增加了 150 MB,但将清零所需的内存量(通过上面的#1-#3 方法)从 1.25 GB 减少到只有 300 MB!这是我的工作解决方案,但知道处理这个问题的最佳方法会很棒。

最佳答案

不幸的是我现在时间不多,所以我必须简洁......

在处理大数据时,您需要注意 Mathematica 有一种不同的存储格式,称为打包数组,它比常规存储格式更紧凑且速度更快,但仅适用于机器实数或整数。

请评价?Developer`*Packed*查看哪些函数可用于直接转换为/从它们转换,如果这不会自动发生。

因此,为什么我的解决方案速度快且内存效率高,其背后的简要解释是它使用压缩数组。我使用 Developer`PackedArrayQ 进行了测试我的数组永远不会被解包,我使用了机器实数(我将 N[] 应用于所有内容)

In[1]:= myData = N@RandomInteger[{1, 100}, {200, 400, 500}];

In[2]:= myZero =
Developer`ToPackedArray@
N@Table[RandomInteger[{1, 9}]/RandomInteger[{1, 9}] + 50, {i, 500}];

In[3]:= myData = Map[# - myZero &, myData, {2}]; // Timing

Out[3]= {1.516, Null}

此外,您要求的操作(“我想扫描每个元素,并在内存中的那个位置更改它”)称为映射(参见 Map[]/@ )。

关于wolfram-mathematica - 转换嵌套列表而不复制或丢失精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com