前段时间遇到一个问题,在for循环中出现了numpy.float64 object is not iterable的问题,网上一查,发现是个经典问题,大神们的解决方案也不太一样,有的说是因为有numpy的版本过高导致的问题,可以采取降版本的方式(但个人觉得降版本听上去就好麻烦,所以并没有尝试)。查找了半天,也没有看到类似的解决方案,终于摸索出我的问题在哪了。上代码:
for i in range(len(x_mat)):
x_norm[i] = [math.atan(temp_x)*2/math.pi for temp_x in x_mat[0]]
这里的代码是对一个二维矩阵每一行做相应的处理,若x_mat是二维矩阵,OK!这里代码是可以完美运行,但是当x_mat是一维的时候就报错(因为此时的x_mat[0]是一个数,不能进行循环):
TypeError:numpy.float64 object is not iterable
当然单独写的时候肯定会传入二维矩阵,但是这里为什么会出现一维的情况呢?经过尝试后发现问题,下面是尝试:
>>> x = numpy.array([[1,2,3], [4,5,6]])
这里我取出x的第一行:
>>> x0 = x[0]
>>> x0.shape
OUT: (3,)
这里问题就出现了,其实我是想取出一个二维的矩阵,其shape = (1,3),但是实际取出来的shape = (3, ),这个x0变成了一维数组,跟想象中的不一样啊!!!
好的,知道哪里出现坑了,这个时候就要填坑了,即将取出的一维数组变成二维矩阵。
首先,这里用转置无效,因为一维数组转置后还是一维:
>>> a = numpy.transpose(x0)
>>> a.shape
OUT: (3,)
这里给出两个可行方法:
>>> b,c = x0, x0
>>> b.shape = (1, len(b))
>>> b.shape
OUT: (1, 3)
>>> c = c[numpy.newaxis, :]
>>> c.shape
OUT: (1, 3)
好了,填坑的方法也找到了,去填坑吧!
这里给出一个我的判断数组是否为一维的可行方法:
if len(x0.shape) == 1
总结下出现这个问题:
1、出现numpy.float64 object is not iterable错误时,首先查看是否是因为维度出现问题(一般是)。
2、在numpy.array中从二维数组取出某一行时,取出来的数组不是二维数组了,而是变成一维数组了,很有可能使后续程序报错(如循环,添加元素,或是拼接矩阵等等)。因此,在取出二维数组后,最好是加一些判断,看看取出的数组维度大小是不是你想要的维度大小。
希望对遇到同样坑的小伙伴有所帮助,同样,有大神有更好更简洁的解决方法,请指教!不胜感激!
TypeError: ‘
numpy.
float64’
object is not
iterable错误出现了,是代码无法迭代。
我的代码是这样的:
import
numpy as np
VOLi=15
pt=0.63
for i in np.arange(0, VOLi + 1):
n=np.math.factorial(VOLi)
m=np.math.factorial(i)
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
TypeError: ‘NoneType’ object is not iterable 这个错误提示一般发生在将None赋给多个值时。
def myprocess():
a == b
if a != b:
return True, value;
flag, val = myprocess()
在判断语句中,当if条件不满足,并且没有else语句时,函数默认返回None。
在没有return语句时,Python也默认会返回None
调用时,将Non
predict_xlist是一个list;lstm_predict1是array类型,其中shape(128,1),而此处只去一个元素添加到predict_xlist中,因此使用extend方法会报错。
list有多中迭代添加方法,其中extend和append是最常用的,区别在于:extend添加的是一个list,而append是任何数据类型。此处只是一个value,则应该使用app...