np.array中一个小问题的解决

在进行fisher线性分类面学习时,设计一个很简单的操作,即对两类样本求类内平均值。方法很简单,用一个min向量存储每个元素的和再除以元素个数即可。但即使这么简单的操作,却出现了问题:

dataset_negative = np.array([35, 21.5, 39, 21.7, 34, 16, 37, 17])
dataset_negative = dataset_negative.reshape(4, 2)
mean_negative = np.array([0,0])
for i in range(0, len(dataset_negative)):
    mean_negative[0] = mean_negative[0] + dataset_negative[i][0]
    mean_negative[1] = mean_negative[1] + dataset_negative[i][1]
mean_negative = mean_negative / len(dataset_negative)
print(mean_negative)

结果:[36.25 18.75]
跟手算的结果不一样?应该是36.25,19.05.
对过程进行单步调试发现,mean_negative在遇到小数时计算出错,只要了计算结果中的整数部分。
这是由于,mean_negative向量初始化时设成了整数,而int32在与float做计算时会自动“吃掉”小数部分,造成运算结果的错误。可以发现在下面这个例子当中,运算结果均丢掉了小数部分。

a = np.array([3, 3, 3, 3, 3, 3])
for i in range(0, 3):
    a[i] += 0.8
for i in range(3, len(a)):
    a[i] += 1.2
print(a)

结果:[3 3 3 4 4 4]
解决方法很简单,将mean-negative初始化为0.0,0.0即可。或者在np.array的括号当中加入dtype=‘float64’.

mean_negative = np.array([0, 0], dtype='float64')

结果:[36.25 19.05],结果正确。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值