无法将np.random.normal求和结果赋值给数组元素,求错误解决方法
解决numpy赋值时的ValueError错误
问题代码
np.random.seed(0) sum=np.zeros(10,dtype=float) for i in np.arange(1,11): X = np.random.normal(size=(10,1)) Y=np.sum(X,axis=1) sum[i-1]=Y print(sum)
报错信息
TypeError Traceback (most recent call last) TypeError: only size-1 arrays can be converted to Python scalars The above exception was the direct cause of the following exception: ValueError Traceback (most recent call last) <ipython-input-14-33fba8ac5d90> in <module> 6 X = np.random.normal(size=(10,1)) 7 Y=np.sum(X,axis=1) ----> 8 sum[i-1]=Y 9 print(sum) ValueError: setting an array element with a sequence.
错误原因
你创建的sum是长度为10的一维数组,每个元素都是单个float标量。但X = np.random.normal(size=(10,1))生成的是10行1列的二维数组,np.sum(X,axis=1)会沿着行方向求和,得到的Y是长度为10的一维数组(形状为(10,))。把长度10的数组赋值给sum的单个元素,自然会触发"用序列设置数组元素"的错误。
解决方案
分两种情况处理:
情况1:每次对整个X数组求和得到一个标量,赋值给sum的单个元素
如果你的需求是每次生成(10,1)的数组后,求所有元素的总和(得到一个标量),然后把这个标量存入sum数组,只需要修改求和的axis参数,直接对整个数组求和:
np.random.seed(0) sum_arr = np.zeros(10, dtype=float) # 避免用sum作为变量名,和内置函数冲突 for i in np.arange(1,11): X = np.random.normal(size=(10,1)) Y = np.sum(X) # 去掉axis=1,对整个数组求和得到标量 sum_arr[i-1] = Y print(sum_arr)
注意:尽量不要用sum作为变量名,它会覆盖Python内置的sum()函数,可能引发其他问题,这里改为sum_arr。
情况2:每次生成的Y数组作为sum的一行
如果你的需求是把每次得到的长度10的Y数组作为sum的一行,那需要把sum初始化为二维数组:
np.random.seed(0) sum_arr = np.zeros((10,10), dtype=float) # 10行10列的二维数组 for i in np.arange(1,11): X = np.random.normal(size=(10,1)) Y = np.sum(X, axis=1) sum_arr[i-1] = Y # 把Y赋值给sum_arr的第i-1行 print(sum_arr)
内容的提问来源于stack exchange,提问作者XYJ
相关产品推荐
相关产品推荐

