例如:一个二维数组可以被可视化为带有方砖的砖墙,其中每块砖都代表我们数组中的一个坐标。3 维数组可以以同样的方式可视化为一个盒子或立方体。
但是,这是棘手的部分,您如何可视化具有多个(超过 3 个)维度的数组?或者,对于那部分,您如何可视化一个不仅具有多个维度,而且具有多个层中的多个维度的数组?
例如:您如何可视化这样的数组:Array[3,3,3,3][3,3][3,3,3,3,3][3]?
例如:一个二维数组可以被可视化为带有方砖的砖墙,其中每块砖都代表我们数组中的一个坐标。3 维数组可以以同样的方式可视化为一个盒子或立方体。
但是,这是棘手的部分,您如何可视化具有多个(超过 3 个)维度的数组?或者,对于那部分,您如何可视化一个不仅具有多个维度,而且具有多个层中的多个维度的数组?
例如:您如何可视化这样的数组:Array[3,3,3,3][3,3][3,3,3,3,3][3]?
您如何可视化数组实际上取决于它们的实际用途。如果您将数组用于空间关系,那么您可以从将其想象为立方体中受益,但您也无需想象超过 3 个维度。如果您真的真的想要实现第四个时间维度,您可以想象您的立方体内容随着时间的推移而变化。
否则,您可能会跟踪密切相关的记录。或许每一级元素都是一个星系,二级元素是星团,三级元素是太阳系,四级元素是行星,五级元素是大陆……
在这种情况下,您可以想象它是数组中的数组。如果你需要一个 4 维数组,那么你可以想象一个立方体,但每个子立方体实际上是一个一维数组。
如果您需要一个 5 维数组,那么您可以想象一个立方体,但每个子立方体都分为您的“砖墙”示例。
6 维是一个立方体,每个子立方体是它自己的分割立方体。
这往往会在 6 维之后分崩离析。除此之外,通常还有一个更实际的原因是您需要这么多维度。例如,像 eHarmony 这样的网站通过在 20+ 维空间上使用普通几何来进行匹配。你有一个维度表示“幽默”,一个表示“好看”,一个表示“爱购物”......然后你可以带两个人并应用距离公式(将每个维度差异平方,添加这些差异,平方根) 并确定两个人的兼容性。因此,如果一个人在我们的 9 维人格矩阵上得分“5、3、9、2、8、4、7、3、1”,而另一个人得分“9、3、7、1、8、2、8、4” , 7" 那么你的兼容性是:
sqrt((5-9)^2+(3-3)^2+(9-7)^2+...)
这可以应用于无限维度并且仍然有效。但是,由于这些维度不适用于空间,因此无需将它们可视化。相反,在这种特殊情况下,我们实际上可以将其想象为具有多个整数值的一维数组。请注意,我们可以简化这个数组的原因是我们的多维数组只包含一个“1”,其余的都是“0”(表示这个人在这个数组中的位置)。
远离 eHarmony 示例,重点是 - 在一定数量的维度之后,您通常对数组有实际用途,这有助于感知它的方法。
有些人可以在心理上为 n > 3 建模 n 维几何,至少就简单的形状而言,有些人不能。(当我最近与一个从事高级 n 维几何领域的人交谈时得知他无法想象超立方体时,我感到非常惊讶,而我可以但发现他的数学远远超出了我的能力)。
但这并不是真的必要。实际上,很少有必要将二维数组可视化为笛卡尔坐标 - 当您在实践中使用二维数组时,您对每个轴都有一些目的,并且该目的很快变得比任何视觉表示更重要。
如果确实需要,那么考虑一个二维数组也可以被视为一组有序的一维结构。同样,一个 3 维数组可以被认为是一组有序的 2 维结构,或一组 1 维(这些组大小相等 - 允许不同大小将物质移动到锯齿状数组中)。
因此,一个 4 维数组可以被认为是一组有序的 3 维结构,依此类推。
有许多可爱的方法可以可视化多维数据。我的最爱之一是 Alfred Inselberg 的Parallel Coordinates,它将每个维度表示为垂直轴,将每个数据点表示为连接它们的线程:
另一个很棒的可视化是 Ramana Rao 的Table Lens (pdf):
这将每个维度表示为一列,就像在电子表格中一样,但以图形方式而不是数字方式。特别擅长展示维度之间的相关性;当您按一个维度排序时,很容易看到相关维度如何与其一起排序。
你没有。您甚至需要超过 2 或 3 个维度的情况很少见。如果您需要更多,那么也许应该将额外的维度建模为对象的属性,在这种情况下,您可以将它们视为属性,而不是试图想象一些神话般的超立方体。
试着减去它。如果你需要想象一个十维数组,那么首先想象所有有限非负整数 n 的所有 n 维实值欧几里得向量空间的集合。{ R0, R1, R2, ... }
现在想象一下,拿走几乎所有这些,只剩下 R10。
现在想象一下去掉几乎所有这些,这样你就只剩下 R10 中的整数格点了。
现在想象一下,几乎把所有这些都去掉,这样你就只有整数格点的超矩形子集了。
你完成了;这是一个很好的 10 维数组的可视化。当您将其视为所有可能的 n 维向量空间集的子集时,它确实非常小。
如果您对高维空间的主题感兴趣,您可能想阅读我对高维向量空间数据库搜索算法的一些有趣事实的简要介绍:
http://blogs.msdn.com/b/ericlippert/archive/tags/high+dimensional+spaces/
超过 3 个维度,您唯一的选择是树形视图或向下钻取。
与您可视化4 个空间维度的方式相同:“切片”、叠加或将其投影到您已经理解并可以可视化的内容上。
把每一个额外的维度想象成一个“封闭的盒子”。将 2D 数组视为 1D 数组的数组,将 3D 数组视为 2D 数组的数组,依此类推。
这里有些例子...
一维 1x2 阵列:
[ 1, 2 ]
2D 2x2 阵列:
{ [ 1, 2 ], [ 3, 4 ] }
{ [ 5, 6 ], [ 7, 8 ] }
3D 2x2x2 阵列:
( { [ 1, 2 ], [ 3, 4 ] }, { [ 5, 6 ], [ 7, 8 ] } )
( { [ 9, 0 ], [ 1, 2 ] }, { [ 3, 4 ], [ 5, 6 ] } )
您可以将财务报告可视化为一个数组,其中数据来自电子表格形式的多个实体:
然后,出于全局合并的目的,控制器可能会从每个区域接收工作簿——这将是第四个维度。如果您需要随时间操纵销售数据(例如发现趋势),第五个维度可能是“时间”。
理论上,您可以在单个 5D 数组变量中保存多年、多地区的销售数据。
正如人们上面所说,您确实需要首先考虑一个应用程序,然后逻辑数据结构将有助于定义合适的物理形式。任何可以关联建模的属性集都可以正常放置在数组中。
托尼
不想在这里放弃农场,但这是我如何看待 PHP 中的多维数组的一个示例。
$map[room][x][y][z][id][photopath][flag1][flag2]
我想象它作为 3D 空间中的一个点会是什么样子,然后我只需添加排序属性。在这里,假设您正在玩《毁灭战士 3》。每张地图都可分为多个房间,这些房间的像素具有 x、y 和 z 坐标。这些点中的每一个都可以有一个与之关联的对象 ID(怪物、项目等)。我为我的应用程序添加了更多属性,但基本上就是这样。数组中的点不一定要在几何上准确;它可以有任何意义。这是否与其他人的做法相似,我不知道。我确实知道使用 gd 图形库可以为多维数组提供一个很好的可视化工具,但是我上次为这个客户工作时没有进入那个项目。
将 4D 数组可视化为 1D 立方体数组。一个 5D 数组作为一个 2D 立方体数组。和一个 6D 阵列作为立方体的 3D 阵列,或立方体的立方体。一个 7D 数组作为立方体的一维数组,等等......
忽略是否需要这些维度,为什么不将 4D 数组设想为“立方体”的 1D 数组(线)。(即:一个 1D 数组,其中每个元素都指向一个 3D 立方体)。这可以根据需要放大(即:每个元素指向一个立方体的二维表面)。这当然不是超立方体的“外观”,但这不是必需的。
标签:)
3 维数据的选项卡为您提供 4 个维度,选项卡的选项卡为您提供 n 维。
不一定是可视化它的最佳方式。也不适合在任何维度上旋转。
但是,这取决于您要想象的内容
例如,RGB 可以转换为 2D 地图,然后投影到立方体上,为您提供 4d 信息