use*_*183 5 python arrays numpy
我有一个多维对象数组,例如:
a = np.array([obj1,obj2,obj3])
Run Code Online (Sandbox Code Playgroud)
对象是具有多个属性的类的实例。假设其中之一是高度,其中之一是长度。要获得相应的多维长度和高度数组,我执行以下操作:
lengths = np.array([obj1.length,obj2.length,obj3.length])
heights = np.array([obj1.height,obj2.height,obj3.height])
Run Code Online (Sandbox Code Playgroud)
这开始使我的代码混乱很多。有没有更有效的方法来做到这一点?例如,我有类似的东西
heights = a.height
Run Code Online (Sandbox Code Playgroud)
记住,但显然它不起作用,因为 a 是我的对象而不是我的对象的数组。但是有没有类似的东西我可以做,既高效又pythonic?我试过类似的东西
for x in np.nditer(a,flags=['refs_ok']):
print x.length
Run Code Online (Sandbox Code Playgroud)
看看会发生什么,但它不起作用,因为 nditer 以某种方式返回一个元组。
有任何想法吗?
您可以向量化该函数:
>>> import numpy
>>>
>>> class Obj(object):
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> arr = numpy.array([Obj(1, 2), Obj(3, 4), Obj(5, 6)])
>>>
>>> vectorized_x = numpy.vectorize(lambda obj: obj.x)
>>>
>>> vectorized_x(arr)
array([1, 3, 5])
Run Code Online (Sandbox Code Playgroud)
尽管我不确定您是否应该首先存储 Python 对象的 NumPy 数组。Vectorize 并不比 Python 循环更高效。存储 (n+1)-D 数组会更有效,因为我们可以简单地通过切片(这是本机操作)轻松提取内容,例如
>>> a = numpy.array([[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10), (11, 12)], [(-13, -14), (-15, -16), (-17, -18)]])
>>> a[:,:,0]
array([[ 1, 3, 5],
[ 7, 9, 11],
[-13, -15, -17]])
>>> a[:,:,1]
array([[ 2, 4, 6],
[ 8, 10, 12],
[-14, -16, -18]])
Run Code Online (Sandbox Code Playgroud)