c++向量和数组的区别_学习 R 语言:向量

本文内容来自《R 语言编程艺术》(The Art of R Programming),有部分修改

R 语言最基本的数据类型是向量

本节会关注以下话题:

  • 循环补齐

  • 筛选

  • 向量化

注:本文代码运行在 Jupyter Notebook 中,所以使用 print 函数输出变量;如果直接在命令行交互环境中运行,则无需使用 print 函数

标量、向量、数组与矩阵

R 语言中变量类型被称为模式 (mode)。同一向量中的所有元素必须是相同的模式。

添加或删除向量元素

R 语言中向量是连续存储的,不能插入或删除数据。

注:类似 C++ 中的 std::array,在创建时就已经确定数组大小,后续无法修改大小

插入和删除数据实际上是对变量重新赋值

注:插入删除数据会生成新的向量

 c(88, 5, 12, 13)
x c(x[1:3], 168, x[4])print(x)
[1]  88   5  12 168  13

注:可以将 x 看成类似 C 语言中的指针

获取向量长度

使用 length() 函数

 c(1, 2, 4)print(length(x))
[1] 3

获取第一个 1 所在位置的索引(不一定有效率)

 function(x) {
    for (i in 1:length(x)) {
    if (x[i] == 1) break
}return(i)
}print(first1(c(12, 13, 1, 3, 4)))
[1] 3

R 语言中,1:n 返回从 1 到 n 的向量,类似 Python 中的 range 函数。

但 first1 不能处理 x 为空的情况

代码

print(

会抛出下面的异常

Error in if (x[i] == 1) break: 参数长度为零
Traceback:

1. print(first1(c()))
2. first1(c())
 c()print(x)
NULL
print(
[1] 0
print(
[1] 1 0

当 x 为空时,1:length(x) 返回值是 1 0 二元向量。

注:在 Python 中 list(range(1, 0)) 返回的是空列表。

作为向量的矩阵和数组

数组和矩阵实际上都是向量,只不过有额外的类属性。

本节介绍的一切内容,同样适用于矩阵和数组。

 rbind(c(1, 2, 3),c(4, 5, 6)
)print(m)
     [,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
print(m 
     [,1] [,2] [,3]
[1,] 2 5 8
[2,] 6 9 12

上面的加法实际上就是两个向量相加

注:后续章节会介绍矩阵是按列存储的向量

声明

与 Python 一样,R 语言不需要声明变量。但引用向量中的特定元素前,必须事先创建该对象。

直接执行下面代码会出错

 5
y[2] 6

我们需要首先创建长度为 2 的空向量,才能完成赋值。

使用 vector() 函数创建空向量

 vector(length=2)print(y)
[1] FALSE FALSE
 5print(y)
[1] 5 0
 12print(y)
[1]  5 12

如果使用新类型的值赋值给某个元素,整个向量的类型也会自动改变(注:可能是生成了新的对象?)

 "a"print(y)
[1] "a"  "12"

类似 x 和 y 等变量只是对实际对象的绑定,本身没有类型限制,可以绑定任意类型

 c(1, 5)print(mode(x))
[1] "numeric"
 "abc"print(mode(x))
[1] "character"

循环补齐

两个向量使用运算符时,如果要求两个向量具有相同的长度,R 会自动循环补齐 (recycle),即重复较短的向量,直到它与另一个向量长度相匹配。

print(
Warning message in c(1, 2, 4) + c(6, 0, 9, 20, 22):
"长的对象长度不是短的对象长度的整倍数"
[1] 7 2 13 21 24

上面计算以如下方式执行

print(
[1]  7  2 13 21 24

注:numpy 中的广播机制好像只针对不同维度,无法实现上面运算。可以用 numpy.resize 模拟循环补齐效果。

下面是矩阵的例子

 cbind(c(1, 2, 3),c(4, 5, 6)
)print(x)
     [,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
print(x 
     [,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8

矩阵是按列排序的向量,所以加号右边的向量被补齐到矩阵元素的个数

print(x 
     [,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8

返回的结果同样被表示成矩阵的形式,实际上被补齐的向量在相加前也被转为矩阵形式,即

cfd351af50389b4151835173efbfcd84.png
print(x 
     [,1] [,2]
[1,] 2 6
[2,] 4 6
[3,] 4 8

常用的向量运算

向量运算和逻辑运算

R 是函数式语言,运算符也是一个函数

print(
[1] 5
print(
[1] 5

向量元素加法

 c(1, 2, 4)print(x + c(5, 0, -1))
[1] 6 2 3

向量元素乘法

print(x 
[1]  5  0 -4

其他元素运算

 c(1, 2, 4)print(x / c(5, 4, -1))
[1]  0.2  0.5 -4.0
print(x 
[1] 1 2 0

向量索引

向量1[向量2]

 c(1.2, 3.9, 0.4, 0.12)print(y[c(1, 3)])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值