使用Numpy nditer遍历二维对象数组遇属性错误,如何解决?
解决NumPy对象数组遍历访问对象属性的问题
你遇到的问题是因为np.nditer返回的迭代元素并不是直接的example实例,而是被包装成了一个0维NumPy数组对象,这个数组对象自然没有你定义的.number属性,所以才会抛出AttributeError。
下面给你几种可行的解决方案:
方案1:从nditer的结果中提取实际对象
使用x.item()或者x[()]可以把0维数组里包装的example实例取出来,之后就能正常访问属性了:
import numpy as np class example: def __init__(self): self.number = 1 a = example() b = example() c = example() d = example() array = np.array([[a,b],[c,d]],dtype=np.object) for x in np.nditer(array, ["refs_ok"]): # 提取实际对象并访问属性 print(x.item().number) # 或者用 print(x[()].number)
方案2:直接嵌套遍历二维数组
如果不需要用nditer,直接遍历数组的行和元素会更直观,拿到的就是原始的example实例:
import numpy as np class example: def __init__(self): self.number = 1 a = example() b = example() c = example() d = example() array = np.array([[a,b],[c,d]],dtype=np.object) for row in array: for obj in row: print(obj.number)
方案3:使用数组的flat属性展平遍历
利用NumPy数组的flat属性可以把二维数组展平为一维迭代器,遍历起来更简洁:
import numpy as np class example: def __init__(self): self.number = 1 a = example() b = example() c = example() d = example() array = np.array([[a,b],[c,d]],dtype=np.object) for obj in array.flat: print(obj.number)
这几种方法都能成功打印每个对象的number属性,你可以根据自己的需求选择最合适的方式~
内容的提问来源于stack exchange,提问作者Shuo Liu
相关产品推荐
相关产品推荐

