[英]Numpy Iterate over 2d object array
我有一个二维对象数组。 我想遍历此数组,并打印每个对象的某些属性。 下面是我的代码:
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
错误消息: AttributeError: 'numpy.ndarray' object has no attribute 'number'
我如何实现我的目标? 谢谢!!
In [81]: class example:
...: def __init__(self):
...: self.number = 1
...:
In [82]: a = example()
In [83]: b = example()
对于示例一维数组,简单的迭代就足够了:
In [84]: arr = np.array([a,b], object)
In [85]: arr
Out[85]:
array([<__main__.example object at 0xaa7d530c>,
<__main__.example object at 0xaa5f84ec>], dtype=object)
In [86]: for a in arr:
...: print(a.number)
...:
1
1
我不鼓励您使用nditer
除非您确实需要它,或者打算最终在编译后的代码中使用它。 这不是更快的迭代方式(在Python级别)。 但是,如果您使用它,则需要了解它的作用:
In [89]: for x in np.nditer(arr,["refs_ok"]):
...: print(x, type(x), x.shape)
...:
...:
<__main__.example object at 0xaa7d530c> <class 'numpy.ndarray'> ()
<__main__.example object at 0xaa5f84ec> <class 'numpy.ndarray'> ()
x
是一个0d数组,包含对象。 它不是对象本身。 要访问对象属性,您需要从数组中提取对象:
In [90]: for x in np.nditer(arr,["refs_ok"]):
...: print(x.item(), x.item().number)
...:
...:
<__main__.example object at 0xaa7d530c> 1
<__main__.example object at 0xaa5f84ec> 1
对于2d,我们可以做一个双循环,或者展平数组然后循环。 但是frompyfunc
很好地将函数应用于数组的每个元素。 它是np.vectorize
的基础功能(也可以使用。
In [91]: arr = np.array([[a,b],[b,a]],dtype=np.object)
In [92]: arr
Out[92]:
array([[<__main__.example object at 0xaa5f84ec>,
<__main__.example object at 0xaa5f84ec>],
[<__main__.example object at 0xaa5f84ec>,
<__main__.example object at 0xaa5f84ec>]], dtype=object)
In [93]: f = np.frompyfunc(lambda x: x.number, 1, 1)
In [94]: f(arr)
Out[94]:
array([[1, 1],
[1, 1]], dtype=object)
nditer
也可以在2d数组上工作:
In [95]: for x in np.nditer(arr,["refs_ok"]):
...: print(x.item(), x.item().number)
...:
<__main__.example object at 0xaa5f84ec> 1
<__main__.example object at 0xaa5f84ec> 1
<__main__.example object at 0xaa5f84ec> 1
<__main__.example object at 0xaa5f84ec> 1
In [97]: it = np.nditer([arr,None],["refs_ok"],)
...: for x,y in it:
...: y[...] = x.item().number
...:
...:
In [98]: it.operands
Out[98]:
(array([[<__main__.example object at 0xaa5f84ec>,
<__main__.example object at 0xaa5f84ec>],
[<__main__.example object at 0xaa5f84ec>,
<__main__.example object at 0xaa5f84ec>]], dtype=object),
array([[1, 1],
[1, 1]], dtype=object))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.