机器学习中的数学(2):numpy中切片、行列向量,奇异值分解

1.ndarray数组维度-横向量和列向量

a = array([1,2,3])    #一维列向量
print(a.shape, a)
b = array([[1,2,3]])    #二维横向量
print(b.shape, b)

(3,) [1 2 3]
(1, 3) [[1 2 3]]

{关于numpy数组维度表示上的区别,numpy多维数组横向量和列向量的区别}

zeros([5,])    #返回的是一维列向量
[ 0.  0.  0.  0.  0.]
#等价于这样的矩阵(一维数组),zeros([5])、zeros(5)以及zeros(5,)
zeros([5, 1])    #返回的是二维列向量
[[ 0.]
 [ 0.]
 [ 0.]
 [ 0.]
 [ 0.]]
zeros([1, 5])    #二维横向量
[[ 0.  0.  0.  0.  0.]]


a = array([1,2,3])    #一维列向量
print(a.shape, a)
b = array([[1,2,3]])    #二维横向量
print(b.shape, b)

(3,) [1 2 3]
(1, 3) [[1 2 3]]

Note:a=np.array([1,2,3]) 由 a.shape知道a是一个列向量,而b=np.array([[1,2,3]])是一个横向量。

b=arange(1,5)   #列向量
print(b.shape, b)
a=array([[1,2,3,4]])#横向量
print(a.shape, a)
print(a+b)

(4,) [1 2 3 4]
(1, 4) [[1 2 3 4]]
[[2 4 6 8]]

Note:

  1. 上面的例子没有说明的,数值就是原来的,没有变。比较上面知道,基本上横向量和列向量是可以任意加减的。但是其他的要有一样的shape才可以。
    2.一维列向量的转置还是本身。
  2. 一维列向量(如(3,))在广播运算中是当做二维行向量(如(1,3))计算的。也就是说(3,)相当于(1,3)。

2.array元素存取

元素存取的不同方式

下标范围存取元素

结束索引在这儿是不被包含的!和python中的list的索引相同!但是不同于pandas中的索引是被包含的!!!

数组元素的存取方法和Python的标准方法相同:

>>> a = np.arange(10)
>>> a[5]    # 用整数作为下标可以获取数组中的某个元素
5
>>> a[3:5]  # 用范围作为下标获取数组的一个切片,包括a[3]不包括a[5]
array([3, 4])
>>> a[:5]   # 省略开始下标,表示从a[0]开始
array([0, 1, 2, 3, 4])
>>> a[:-1]  # 下标可以使用负数,表示从数组后往前数
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a[2:4] = 100,101    # 下标还可以用来修改元素的值
>>> a
array([  0,   1, 100, 101,   4,   5,   6,   7,   8,   9])
>>> a[1:-1:2]   # 范围中的第三个参数表示步长,2表示隔一个元素取一个元素
array([  1, 101,   5,   7])
>>> a[::-1] # 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒
array([  9,   8,   7,   6,   5,   4, 101, 100,   1,   0])
>>> a[5:1:-2] # 步长为负数时,开始下标必须大于结束下标
array([  5, 101])

numpy数组下标是可以越界的!

b
array([1, 2, 3, 4, 5, 6])

b[1:30309]
array([2, 3, 4, 5, 6])
如果越界了,会自动检测,只返回到结尾的数据。

和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图,它与原始数组共享同一块数据空间。

>>> b = a[3:7] # 通过下标范围产生一个新的数组b,b和a共享同一块数据空间
>>> b
array([101,   4,   5,   6])
>>> b[2] = -10 # 将b的第2个元素修改为-10
>>> b
array([101,   4, -10,   6])
>>> a # a的第5个元素也被修改为10
array([  0,   1, 100, 101,   4, -10,   6,   7,   8,   9])

除了使用下标范围存取元素之外,NumPy还提供了两种存取元素的高级方法。

3.使用整数序列

当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。

>>> x = np.arange(10,1,-1)
>>> x
array([10,  9,  8,  7,  6,  5,  4,  3,  2])
>>> x[[3, 3, 1, 8]] # 获取x中的下标为3, 3, 1, 8的4个元素,组成一个新的数组;python自带的list不能这么做
array([7, 7, 9, 2])
>>> b = x[np.array([3,3,-3,8])]  #下标可以是负数
>>> b[2] = 100
>>> b
array([7, 7, 100, 2])
>>> x   # 由于b和x不共享数据空间,因此x中的值并没有改变
array([10,  9,  8,  7,  6,  5,  4,  3,  2])
>>> x[[3,5,1]] = -1, -2, -3 # 整数序列下标也可以用来修改元素的值
>>> x
array([10, -3,  8, -1,  6, -2,  4,  3,  2])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值