numpy arrays中归约运算和切片运算时的维度变化问题

如下代码所示:

import numpy as np

aa = np.ones((5,3),np.int64)
print(aa)

bb = aa[2, :]      #截取矩阵第二行
print(bb.shape)

输出为:

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

(3,)表示什么意思呢?按照我们的思维,截取之后的bb应该是一个1*3的矩阵,然而,np array在切片的时候,自动改变了维度,现在bb已经变成了一维数组,那么其二维自然不存在,用一个图形象表示:

 [[], [], [], ...] (二维数组)————》[](一维数组)而不是[[],](第二维度为1的二维数组)
此时,如果你把bb当做一个1*3的矩阵去做运算,那么就会发生不可描述的错误,并且还不会报语法错误。
如下:
cc = np.ones((3,1),np.int64)
dd = bb * cc
print(dd)
输出如下:
[[1 1 1]
 [1 1 1]
 [1 1 1]]
咋一看似乎没错,但是cc是一个3*1的矩阵,而bb如果是1*3的话,那么结果应该是1*1的一个数,然而事实是结果产生了一个二维数组。
这就是因为bb变成了一维数组。而二维数组与一维数组之间是没有好结果的QAQ

解决方案其实很简单,因为numpy matrix总是保持二维,你可以直接转变为matrix之后再做变化,如下:
import numpy as np

aa = np.ones((5,3),np.int64)
aa = np.asmatrix(aa)
bb = aa[2, :]      #截取矩阵第二行
print(bb.shape)
cc = np.ones((3,1),np.int64)
dd = bb * cc
print(dd)

输出如下:
(1, 3):表示bb的类型是二维数组
[[3]] :结果是一个数。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值