python numpy的一些注意事项

python的numpy包是一个经过高度优化过的矩阵计算库,有各种加速组件,很多其他的库也都建立在它之上,适用于大数据计算,但也区别于自带类型列表list。但是其也受限于Python设计规则,或者自身优化的原因,有很多提前注意的要点,这个需要慢慢积累。

首先numpy包支持(3,),以及(3,1),(1,3)形式的向量,后两者是常见的列向量与行向量,可以正常参与矩阵运算,但对以第一个定义比较模糊,其实既不是行向量,也不是列向量,但是却可以行向量去对待。python numpy默认行优先,按行展开,默认优先组成行向量,而matlab按列展开。而tensorflow甚至还支持()shape的张量,比如tf.constant(3),虽然也是按行展开。但是其实到了更高维(三维以及以上),python其实与matlab,甚至c语言维数顺序定义又不一样,哪一个是深度维度。。其实python里面只有第一维,第二维,第三维,你可以按你自己的思路去映射一个张量,运算的时候也是(包括展开,恢复等),但是如果要代表具体的意义,比如tensorflow的特征图意义,则需要指定,不然不好统一。


下面开始正式介绍例程:

https://blog.csdn.net/wintersshi/article/details/80489258


行向量

方式1
import numpy as np
b=np.array([1,2,3]).reshape((1,-1))
print(b,b.shape)

结果:

(array([[1, 2, 3]]), (1, 3))
方式2
import numpy as np
b=np.array([[1,2,3]])	#两层'[]'
print(b,b.shape)

结果

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

列向量

方式1

import numpy as np
a=np.array([1,2,3]).reshape((-1,1))
print(a,a.shape)

结果:

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

方式2

import numpy as np
a=np.array([[1,2,3]]).T
print(a,a.shape)

结果

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

备注

这篇文章写了好久了,中间习惯了在其他网站写博客,所以CSDN好久就没登录了,今天登录后发现这篇文章有很多评论,才发现文章写的确实有问题,实在是抱歉.感谢大家的指正.文章已修改.


关于维度顺序的话,有时候特别容易把人绕晕,所以有人总结了一些自己理解的方法:
https://blog.csdn.net/marukoheart/article/details/88091409

本文关键词: 行列习惯 行列习惯 行列习惯

一、行列维度

A = np.array([1, 2, 3, 4, 5, 6])	# 一维
print(A.shape)
>>>(6,)					# 1X6 (1行6列)
B = np.array([[1, 2], [3, 4], [5, 6]])	# 二维
print(B.shape)
>>>(3, 2)				# 3X2 (3行2列)
C = np.array([[[1], [2]], [[3], [4]], [[5], [6]]])	# 三维
print(C.shape)
>>>(3, 2, 1)				# 可以看到新增加的维度是从左边插入的
矩阵Tips
  1. 行列习惯: 一般说话的习惯是行列 (很少有人习惯说列行吧) ,所以在矩阵中 m x n 就是m行×n列。
  2. 维度是从0开始索引的,矩阵有两个维度,第一个是0维度,第二个是1维度,其中0维度对应行,1维度对应列,符合行列习惯。(上面的代码中生成了3×2的数组B,即0维度有3个元素,1维度有2个元素。)
  3. 一维数组一定要用 1 × n 来记!!
奇怪的分析(可能是错的,看了忘了就好)
  1. 左边插入: 对A,B,C三个数组分析即可知道新增加的维度是从左边插入的 (那为啥0维度是行而不是列? 有点矛盾啊)
  2. 一维数组为啥是 (6 , ) 而不是 (, 6) 。这样才能对应上 (行,列) 吧?
  3. 两个矩阵的乘积(例如Y*Z)必须要满足:Y的1维度元素个数和Z的0维度元素个数相同。
    比如(2, 3) 和 (3, 4) 是满足的,因为都是3个元素。这个很好记,只要中间两个数相同即可,但是要注意一维数组A虽然是 (6, )表示的,但是它乘(6, 1)是满足的!乘(1, 6)是不满足的,所以说一维数组用( , 6)表示更好吧?!

二、axis = 0/1/2

A = np.array([1, 2, 3, 4, 5, 6])
print(A.sum(axis = 0))
>>>21
B = np.array([[1, 2], [3, 4], [5, 6]])
print(B.sum(axis = 0))
print(B.sum(axis = 1))
>>>[ 9 12]		# [1,2] + [3, 4] +[5, 6] = [9, 12]  每一行的和
>>>[ 3  7 11]		#[1, 3, 5] + [2, 4, 6] = [3, 7, 11] 每一列的和
C = np.array([[[1], [2]], [[3], [4]], [[5], [6]]])
print(C.sum(axis = 0))
>>>[[ 9] [12]]

axis是轴的意思,跟维度一样,是从0开始索引。
二维数组中有两个轴:

  1. 0轴沿着0行到1行的方向垂直向下(纵向)
  2. 1轴沿着0列到1列的方向水平延伸(横向)

由于行列没有方向的属性,所以这里用0行到1行的向量来表示方向加强记忆,
这样就又符合行列习惯了 (0对应行,1对应列)

至于axis = 0/1/2运算的分析可以查看
https://blog.csdn.net/sky_kkk/article/details/79725646
思路清奇,便于记忆。


所以的话,在不确定的时候,最好先用简单的numpy实验验证一下,否则可能出错,或者输出可能不是预期的结果。
比如:
https://blog.csdn.net/u012871493/article/details/71055653

numpy中shape为(m,)的数组在矩阵运算的过程中看作行向量处理

在这里插入图片描述
附 Numpy的陷阱

你也可以看看链接下的评论,以及附加链接。。

当然了,最后一篇博文,就直接开门见山了。
https://blog.csdn.net/lyl771857509/article/details/84063850

1、numpy中shape=(m, )其实默认是一个 1xm的行向量

示例:

1.1 生成一个shape=(m,)的数组

 

2、numpy中将行向量转为列向量的集中方法

因为(m,1)是一维数组,默认是行向量,要想变成列向量,mxn. 就必须增加一个维度

2.1  reshape操作

 

2.2 数组中添加一个维度 np.newaxis,可以在任何位置插入一个维度

 

2.3、通过二维数组转置 

 

3、证明shape(m,)默认是个行向量

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值