楼主: sunflowers86
9819 6

[问答] 如何将三维数组转换为矩阵 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

85%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
26 点
帖子
3
精华
0
在线时间
16 小时
注册时间
2015-10-21
最后登录
2018-5-11

楼主
sunflowers86 发表于 2015-10-21 00:28:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
本人没有什么编程基础,我目前有一个很大的三维数组,需要转换为一个矩阵,是否能在R中用循环语句或者其他方式实现?希望高手相助,非常感谢!

三维数组(3, 2, 3)类似下面形式:
, , 1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

, , 3

     [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18


希望转换后的矩阵(6, 3)如下:
1        7        13
4        10        16
2        8        14
5        11        17
3        9        15
6        12        18


再次感谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:非常感谢 循环语句 编程基 如何

沙发
cheetahfly 在职认证  发表于 2015-10-21 08:56:53
假设数组变量为a:

  1. a <- array(1:18, dim=c(3,2,3))
  2. x <- t(a[,,1]) # 将数组第一层转置后赋值
  3. x <- as.vector(x) # 转化为向量
  4. y <- t(a[,,2])
  5. y <- as.vector(y)
  6. z <- t(a[,,3])
  7. z <- as.vector(z)
  8. b <- matrix(c(x,y,z),ncol=3)
复制代码

如果你理解了上面这个方法的要点:矩阵本质上是向量,就可以把程序精简为:
  1. a <- array(1:18, dim=c(3,2,3))
  2. b <- vector()
  3. for (i in 1:3)
  4. b <- c(b, t(a[,,i]))
  5. b <- matrix(b, ncol=3)
复制代码


已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

藤椅
sunflowers86 发表于 2015-10-21 18:07:06
cheetahfly 发表于 2015-10-21 08:56
假设数组变量为a:
非常感谢你的详细解答!

板凳
hongweigg 发表于 2015-10-21 21:18:41
基于楼主数据的特点,可直接用行组合就可以,避免使用循环计算,在进行大数据处理时可显著提高处理效率。

1、假定有数据:
> a <- array(1:18, dim=c(3,2,3))
> a
, , 1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

, , 3

     [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18



2、合成后的矩阵为:
>b<- rbind(a[1,,],a[2,,],a[3,,])
一句话搞定。

3、查看结果
> b
     [,1] [,2] [,3]
[1,]    1    7   13
[2,]    4   10   16
[3,]    2    8   14
[4,]    5   11   17
[5,]    3    9   15
[6,]    6   12   18


4、使用更多数据测试:
> a <- array(1:24, dim=c(3,2,4))
> a
, , 1

     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

, , 2

     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

, , 3

     [,1] [,2]
[1,]   13   16
[2,]   14   17
[3,]   15   18

, , 4

     [,1] [,2]
[1,]   19   22
[2,]   20   23
[3,]   21   24

> b<-rbind(a[1,,],a[2,,],a[3,,])
> b
     [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    4   10   16   22
[3,]    2    8   14   20
[4,]    5   11   17   23
[5,]    3    9   15   21
[6,]    6   12   18   24

已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

报纸
cheetahfly 在职认证  发表于 2015-10-21 22:18:19
hongweigg 发表于 2015-10-21 21:18
基于楼主数据的特点,可直接用行组合就可以,避免使用循环计算,在进行大数据处理时可显著提高处理效率。
...
多谢,这个角度我还没想到。

地板
sunflowers86 发表于 2015-10-22 00:48:35
hongweigg 发表于 2015-10-21 21:18
基于楼主数据的特点,可直接用行组合就可以,避免使用循环计算,在进行大数据处理时可显著提高处理效率。
...
非常感谢两位热心帮忙!我从其他论坛也咨询到了另外两种解决方案,列到下面:

(一)
>> x <- array(1:18, dim=c(3, 2, 3))
>> x
> , , 1
>
>      [,1] [,2]
> [1,]    1    4
> [2,]    2    5
> [3,]    3    6
>
> , , 2
>
>      [,1] [,2]
> [1,]    7   10
> [2,]    8   11
> [3,]    9   12
>
> , , 3
>
>      [,1] [,2]
> [1,]   13   16
> [2,]   14   17
> [3,]   15   18
>
>> apply(x, 3, t)
>      [,1] [,2] [,3]
> [1,]    1    7    13
> [2,]    4   10   16
> [3,]    2    8    14
> [4,]    5   11   17
> [5,]    3    9    15
> [6,]    6   12   18

(二) use aperm() (array index permuation):
  
> array(aperm(x, c(2,1,3)), c(6,3))

       [,1] [,2] [,3]
  [1,]    1    7    13
  [2,]    4   10   16
  [3,]    2    8    14
  [4,]    5   11   17
  [5,]    3    9    15
  [6,]    6   12   18

7
hongweigg 发表于 2015-10-22 10:17:51
参考:http://blog.csdn.net/hongweigg/article/details/49309935

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 21:39