python中的array_python array使用过程中遇到的坑(持续更新)

array和mat的计算思想是不同的,同学们千万别把mat的计算思想想当然的放入到array计算中,否则报错的时候都不知道错在哪。

首先我们都知道np.mat的计算方式,就是我们线性代数中学到到的矩阵相乘,一个n行m列的矩阵和一个m行n列的矩阵相乘,最后得到的是n行n列的矩阵,这个没有任何问题,大家一定要继续保持这个思路,不会线性代数的同学自己去看书,至少要会矩阵相乘吧。

但是到了array数组,其中的坑就比较多了。分别来看一下:

1 数组切片

假设我们有一个

math?formula=100*10的数组a,现在我取切片a[1],我们是不是觉得会输出第2行的数据,维度应该是

math?formula=1*10,但是事实表明,输出的数组自动给你转置了,输出维度其实是

math?formula=10*1。下面来实验一下。

a = np.random.random((100,10))

print("the type of a is %s" % type(a))

print("the shape of a is: ", np.shape(a))

a_cut = a[1]

print("the type of a_cut is %s" % type(a_cut))

print("the shape of a_cut is: ", np.shape(a_cut))

a_cut1 = a[1,:]

print("the type of a_cut1 is %s" % type(a_cut1))

print("the shape of a_cut1 is: ", np.shape(a_cut1))

---输出

the type of a is

the shape of a is: (100, 10)

the type of a_cut is

the shape of a_cut is: (10,)

the type of a_cut1 is

the shape of a_cut1 is: (10,)

从上面可以看出,我及时明显指出我就要第二行的数据,array也是自动给转换成

math?formula=10*1的了。这个和矩阵有区别的,用的时候需要注意下。

2 数组乘法

这个东西真的是太烦了,各种乘法,比如

math?formula=*、multiply、dot,还有一个更奇葩的one-hot编码和一个数组相乘,可以直接用切片,这个不建议初学者使用。我们来分别实验一下吧。

v = np.arange(1,5).reshape(2,2)

w = np.arange(0,4).reshape(2,2)

print("dot’s result is :",v.dot(w))

print("*’s result is :",v*w)

print("multiply’s result is :",np.multiply(v,w))

--结果

dot’s result is : [[ 4 7]

[ 8 15]]

*’s result is : [[ 0 2]

[ 6 12]]

multiply’s result is : [[ 0 2]

[ 6 12]]

对于数组而言,想用类似矩阵的乘法你只有一个选择那就是dot,既然是矩阵乘法,那你得维度可得满足矩阵相乘的规矩,要不然报错给你看啊。*和multiply的作用是相同的,都是数组对应位置相乘,但是这辆还有坑,两个数组维度不同,怎么multiply啊,比如一个

math?formula=2*2和一个

math?formula=2*1的,没有对应位置,咋输出啊,这个不好理解还是先看例子。

w1 = np.array([[1,2],[3,4]])

x1 = np.array([[1],[2]])

w1*x1

--输出

array([[1, 2],

[6, 8]])

这里用到的是广播机制,其实就是将x1由[[1],[2]]扩充为与w1相同维度的[[1,1],[2,2]]在进行对应位置的相乘,采用此原则则所有的*和multiply我们就都能掌握了。

最近看tenserflow,发现了一个新的乘法函数matmul,然后到numpy中查发现里边也有这个函数,当然要实验一把,发现这个函数也是矩阵乘,和dot不一样的地方在于,这个函数只支持np.matmul(x1,x2)而不支持x1.matmul(x2)。数组跟矩阵不一样的地方在于,如果是数组维度不匹配直接报错,而如果是矩阵则会自动交换两个参数位置看是否满足维度规律,如果还不满足才报错。

w1 = np.array([[1,2],[3,4]])

x1 = np.array([[1],[2]])

np.matmul(w1,x1)

--输出

array([[ 5],

[11]])

3 逻辑值切片

先看一个简单的例子,现在有一个array[4 4 3 4 2 3 3 1],我们取其中为4的数,代码如下:

array1 = np.array([4,4,3,4,2,3,3,1])

print(array1 == 4)

array1[array1 == 4]

--输出

[ True True False True False False False False]

array([4, 4, 4])

从上面代码看出 array1 == 4输出的是True和False组成的逻辑值,array进行逻辑切片的时候会保存逻辑真值对应位置的值,而逻辑假对应位置的值则会自动舍弃。

4 array遍历

很多时候啊,我们用模型返回的是一个ndarry,但遗憾的是这种数据类型不能遍历,怎么办呢,还有ndarray一半存储的是一个list,我们通过索引取相应位置的list,就可以遍历了,这种情况比较普遍,写模型的时候要注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值