将 2x6 数组按行重塑为 3x2x2
Reshape 2x6 array into 3x2x2, row-wise
我有以下数组:
set.seed(10)
data <- array(rexp(12), dim=c(2,6))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.398107 0.1704216 0.1664439 0.01057119 2.3546118 0.5222435
[2,] 1.110459 1.9187813 0.9702900 2.79300971 0.6672384 0.1467129
我想重塑它,以获得具有 [3,2,2] 维度的数组,但按行这样做:
, , 1
[,1] [,2]
[1,] 1.398107 0.1704216
[2,] 0.1664439 0.01057119
[3,] 2.3546118 05222435
, , 2
[,1] [,2]
[1,] 1.110459 1.9187813
[2,] 0.9702900 2.79300971
[3,] 0.6672386 0.1467129
我试过 array(data, dim=c(3,2,2))
但它没有按照我想要的方式进行,有什么想法吗?
编辑:
更好的方法是aperm(array(data, c(2, 2, 3)))
。感谢@smci link.
原解:
我用那个种子得到了不同的数据,但你可以使用 matrix
和 lapply
使每一行成为一个两列矩阵,然后 abind
绑定到一个数组中。
set.seed(10)
data <- array(rexp(12), dim=c(2,6))
data
#
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0.01495641 0.7521589 0.2316586 2.3276229 1.2883101 0.4265298
# [2,] 0.92022120 1.5750419 1.0866730 0.7291238 0.6722683 1.1154219
library(abind)
abind(lapply(split(data, row(data)), matrix, ncol = 2, byrow = T)
, along = 3)
# , , 1
#
# [,1] [,2]
# [1,] 0.01495641 0.7521589
# [2,] 0.23165862 2.3276229
# [3,] 1.28831010 0.4265298
#
# , , 2
#
# [,1] [,2]
# [1,] 0.9202212 1.5750419
# [2,] 1.0866730 0.7291238
# [3,] 0.6722683 1.1154219
有管道
library(magrittr)
data %>%
split(row(.)) %>%
lapply(matrix, ncol = 2, byrow = T) %>%
abind(along = 3)
这是一个速度更快且不需要软件包的选项。我认为这不是很清楚。不知道怎么写更清楚。
array(unlist(data)[order(rep(c(1, 3, 2, 4), 3))], dim = c(3, 2, 2))
也许是这个?
array(unlist(data) %>% .[order(!seq_along(.) %% 2
, !seq_along(.) %% 4)]
, dim = c(3, 2, 2))
这可能是更快更简单的基本解决方案:
array( aperm(data, c(2,1) ), c(3,2,2) )
我为那个随机种子得到了一个不同的数组:
data
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.01495641 0.7521589 0.2316586 2.3276229 1.2883101 0.4265298
[2,] 0.92022120 1.5750419 1.0866730 0.7291238 0.6722683 1.1154219
aperm
函数可以将行换成列:
> aperm(data, c(2,1))
[,1] [,2]
[1,] 0.01495641 0.9202212
[2,] 0.75215894 1.5750419
[3,] 0.23165862 1.0866730
[4,] 2.32762287 0.7291238
[5,] 1.28831010 0.6722683
[6,] 0.42652979 1.1154219
然后array
可以重新排列成所需的结构:
> array( aperm(data, c(2,1)), c(3,2,2))
, , 1
[,1] [,2]
[1,] 0.01495641 2.3276229
[2,] 0.75215894 1.2883101
[3,] 0.23165862 0.4265298
, , 2
[,1] [,2]
[1,] 0.9202212 0.7291238
[2,] 1.5750419 0.6722683
[3,] 1.0866730 1.1154219
我有以下数组:
set.seed(10)
data <- array(rexp(12), dim=c(2,6))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.398107 0.1704216 0.1664439 0.01057119 2.3546118 0.5222435
[2,] 1.110459 1.9187813 0.9702900 2.79300971 0.6672384 0.1467129
我想重塑它,以获得具有 [3,2,2] 维度的数组,但按行这样做:
, , 1
[,1] [,2]
[1,] 1.398107 0.1704216
[2,] 0.1664439 0.01057119
[3,] 2.3546118 05222435
, , 2
[,1] [,2]
[1,] 1.110459 1.9187813
[2,] 0.9702900 2.79300971
[3,] 0.6672386 0.1467129
我试过 array(data, dim=c(3,2,2))
但它没有按照我想要的方式进行,有什么想法吗?
编辑:
更好的方法是aperm(array(data, c(2, 2, 3)))
。感谢@smci link.
原解:
我用那个种子得到了不同的数据,但你可以使用 matrix
和 lapply
使每一行成为一个两列矩阵,然后 abind
绑定到一个数组中。
set.seed(10)
data <- array(rexp(12), dim=c(2,6))
data
#
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 0.01495641 0.7521589 0.2316586 2.3276229 1.2883101 0.4265298
# [2,] 0.92022120 1.5750419 1.0866730 0.7291238 0.6722683 1.1154219
library(abind)
abind(lapply(split(data, row(data)), matrix, ncol = 2, byrow = T)
, along = 3)
# , , 1
#
# [,1] [,2]
# [1,] 0.01495641 0.7521589
# [2,] 0.23165862 2.3276229
# [3,] 1.28831010 0.4265298
#
# , , 2
#
# [,1] [,2]
# [1,] 0.9202212 1.5750419
# [2,] 1.0866730 0.7291238
# [3,] 0.6722683 1.1154219
有管道
library(magrittr)
data %>%
split(row(.)) %>%
lapply(matrix, ncol = 2, byrow = T) %>%
abind(along = 3)
这是一个速度更快且不需要软件包的选项。我认为这不是很清楚。不知道怎么写更清楚。
array(unlist(data)[order(rep(c(1, 3, 2, 4), 3))], dim = c(3, 2, 2))
也许是这个?
array(unlist(data) %>% .[order(!seq_along(.) %% 2
, !seq_along(.) %% 4)]
, dim = c(3, 2, 2))
这可能是更快更简单的基本解决方案:
array( aperm(data, c(2,1) ), c(3,2,2) )
我为那个随机种子得到了一个不同的数组:
data
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0.01495641 0.7521589 0.2316586 2.3276229 1.2883101 0.4265298
[2,] 0.92022120 1.5750419 1.0866730 0.7291238 0.6722683 1.1154219
aperm
函数可以将行换成列:
> aperm(data, c(2,1))
[,1] [,2]
[1,] 0.01495641 0.9202212
[2,] 0.75215894 1.5750419
[3,] 0.23165862 1.0866730
[4,] 2.32762287 0.7291238
[5,] 1.28831010 0.6722683
[6,] 0.42652979 1.1154219
然后array
可以重新排列成所需的结构:
> array( aperm(data, c(2,1)), c(3,2,2))
, , 1
[,1] [,2]
[1,] 0.01495641 2.3276229
[2,] 0.75215894 1.2883101
[3,] 0.23165862 0.4265298
, , 2
[,1] [,2]
[1,] 0.9202212 0.7291238
[2,] 1.5750419 0.6722683
[3,] 1.0866730 1.1154219