繁体   English   中英

Numpy迭代2D对象数组

[英]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

nd对象数组

对于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

或从https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.nditer.html#iterator-allocated-output-arrays复制:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM