查找数组的坐标

Posted

技术标签:

【中文标题】查找数组的坐标【英文标题】:Find coordinates of an array 【发布时间】:2022-01-20 16:23:29 【问题描述】:

我有一个三维数组 x 创建为:

vector1 <- c(5, 9, 2)
vector2 <- c(10, 11, 12, 13, 14, 15)
  
x <- array(c(vector1, vector2), dim = c(3, 3, 2))
print(x)

, , 1

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    2   12   15

, , 2

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    2   12   15

我需要找到坐标,即数组最小元素的三个维度位置。这就是我所做的:

which.min(x)
[1] 16

x[16]
[1] 2

现在我知道哪个是最小数字,但我如何找到这个数字的坐标(即 [3,1,2])? 我已经试过了

which(x == 2, arr.ind = TRUE)

但输出是这样的:

dim1 dim2 dim3

我怎样才能得到我正在寻找的东西?

【问题讨论】:

请检查数组的值。即如果值为2.000001== 将返回 FALSE。该值可能不完全等于 2。尝试使用 which(x == min(x), arr.ind = TRUE) 请发布一个可重现的示例,即我们可以剪切和粘贴以查看您所看到的示例。 我试过了,但它仍然在输出:dim1 dim2 dim3 感谢您在其中编辑代码。当我运行 which(x == min(x), arr.ind = TRUE) 时,我将两个解决方案打印为两行矩阵:[1,] 3 1 1[2,] 3 1 2 嗨,你说得对。我的数组和这个不一样。我只是使用了这个,因为它更容易理解,但我的一定有问题。谢谢! 【参考方案1】:

我认为您误解了输出。 “dim1 dim2 dim3”不是结果。它们只是结果的列名,实际上是 2 x 3 数字矩阵。

which(x == 2, arr.ind = TRUE)
#     dim1 dim2 dim3
#[1,]    3    1    1
#[2,]    3    1    2

它告诉您该数组中有两个 2,因为有两行以索引值作为结果。如果您想要 c(3,1,2) 的结果,它将是第二行:

 arr <- which(x == 2, arr.ind = TRUE)
unname(arr[2, ])    # to remove the names that were confusing you.
#[1] 3 1 2

由于您的 cmets 建议您可能存在浮点问题,因此我将通过修改您的示例来创建一个示例,以便您可以看到 R 仅显示度量和数组元素的有限精度,这可能会立即隐藏非常小的差异观看。

 x[3] <- 2.000000001   # small increment
> x
, , 1

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    2   12   15

, , 2

     [,1] [,2] [,3]
[1,]    5   10   13
[2,]    9   11   14
[3,]    2   12   15

> which.min(x)
[1] 12                  twelfth item now the min
> which(x == min(x), arr.ind=TRUE)
     dim1 dim2 dim3
[1,]    3    1    2     # the array index for the 12th item

【讨论】:

以上是关于查找数组的坐标的主要内容,如果未能解决你的问题,请参考以下文章

在二维数组中查找非空网格单元

使用二分法查询二维整型数组的值(找到返回其坐标)

二维数组中的查找

在数组的子数组中查找公共元素

在列表/数组中查找元素的更快方法

在revit api中查找基点的坐标