numpy数组中类的属性

时间:2014-04-19 20:04:57

标签: python arrays class numpy min

我有一个类:

class MyClass:
 def __init__( self, params):
   self.A = params[0]
   self.B = params[1]
   self.C = params[2]

和从这个类的实例构建的numpy数组:

import numpy as np


ArrayA = np.empty((3,4),dtype = object)

for ii in range(3):
  for jj in range(4):
    ArrayA[ii,jj] = MyClass(np.random.rand(3))

我想检索" MyClass.B"对于ArrayA,其中" MyClass.A"是最小的,所以我做了:

WhereMin = np.where(ArrayA[:,:].A)
MinB = ArrayA[WhereMin].B

但这不起作用。有什么想法吗?

修改 当我运行上面的代码时,我收到以下错误:

----> WhereMin = np.nanmin(ArrayA[:,:].A)
AttributeError: 'numpy.ndarray' object has no attribute 'A'

当我希望在" MinB"中使用一系列索引时。

可能的解决方案 我找到了解决问题的可能方法:

Min = np.nanmin([[x.A for x in XX] for XX in ArrayA])
XXX = [[x for x in XX if x.A == Min] for XX in ArrayA]
MinB = [XX for XX in XXX if XX != [] ][0][0].B

可能不是太优雅,但可以胜任。谢谢大家!

2 个答案:

答案 0 :(得分:1)

.A属性属于ArrayA的每个单独元素,而不属于整个数组。因此,ArrayA[0,0].A有效,因为ArrayA[0,0]指向MyClass的实例,但ArrayA[:,:]会返回原始ndarray的副本。

我会考虑重新组织您的数据,以便将.A属性中您想要的所有内容保存在一个numpy数组中,将.B中的所有内容保存在一个numpy数组中,等等。这将有两个优点,1)你可以使用where,2)你的numpy数组将是dtype=float(如果你必须使用numpy,你将失去dtype=object的优势})。

答案 1 :(得分:0)

您可以创建一个结构化的numpy数组。传递dtype字段名称和数据类型的元组列表。然后,您可以通过字段名称索引数组来访问给定字段的完整数组。重做你的例子:

ArrayA = np.zeros((3,4),dtype=[('A','<f4'),('B','<f4'),('C','<f4')])

for ii in range(3):
  for jj in range(4):
    ArrayA[ii,jj] = np.random.rand(3)

minA = ArrayA['A'].min()
WhereMin = np.where(a['A'] == minA)
MinB = ArrayA[WhereMin]['B']