【问题标题】: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
  • 嗨,你说得对。我的数组和这个不一样。我只是使用了这个,因为它更容易理解,但我的一定有问题。谢谢!

标签: r arrays matrix vector indexing


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 2010-12-17
    • 2020-03-04
    • 2017-05-29
    • 1970-01-01
    • 2020-06-23
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多