output operand requires a reduction, but reduction is not enabled

http://stackoverflow.com/questions/11625412/add-a-vector-to-array

 

A really stupid question, but I could not figure the right way..

  1. A is a 2 by 2 matrix, and B is a 2 by 1 matrix.
  2. In a 10 iterations loop, B_new=A*B. B_new is 2 by 1.
  3. Save B_new to an output matrix B_final after each iteration. So in the end, B_final is 2 by 10.

However, I have problem of adding B to B_new in a loop. Below is my code, can anyone give me some suggestions?

import numpy as np
a=np.ones(shape=(2,2))
b=np.ones(shape=(2,1))     
c_final=np.zeros(shape=(2,10))for i in range(0,10):
    c=np.dot(a,b)
    b=c
    c_final[:,i]=c

Here is the error message:

    c_final[:,i]=c
ValueError: output operand requires a reduction, but reduction isnot enabled



The error you're seeing is because when numpy broadcasts c_final[:,i] and np.dot(a,b)together it produces an array with shape (2,2), which then can't be assigned to c_final[:,i]since it has a shape of (2,1). I think it's much clearer if you just play around with it in the interpreter:

>>>import numpy as np
>>> a = np.ones((2,2))>>> b = np.ones((2,1))>>> c_final = np.zeros((2,10))>>> np.dot(a,b)
array([[2.],[2.]])>>> np.dot(a,b).shape
(2,1)>>> c_final[:,0]
array([0.,0.])>>> c_final[:,0].shape
(2,)>>> np.broadcast(c_final[:,0],np.dot(a,b)).shape
(2,2)

The way around this is to flatten np.dot(a,b) by using np.squeeze or something similar so that when they are broadcast together they produce a 2 element array. For example:

>>> c_final[:,0]= np.dot(a,b).squeeze()

You're not alone in finding the error message unhelpful. Someone filed a ticket about this about a year ago.

转载于:https://www.cnblogs.com/jilichuan/archive/2013/04/10/3012349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值