【问题标题】:Atributes of class in numpy arraynumpy数组中类的属性
【发布时间】:2014-06-04 04:29:59
【问题描述】:

我有这样的课程:

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.A”最小的 ArrayA 的“MyClass.B”,所以我这样做了:

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

可能不太优雅,但确实可以。谢谢大家!

【问题讨论】:

  • 什么不起作用?你怎么知道它不起作用?有错误信息吗?如果有,请出示。你得到意想不到的输出吗?如果是这样,你得到了什么,你期望什么?
  • @SethMMorton:感谢您指出这一点,我用错误更新了我的问题。
  • 这似乎是一个简单的 3D 形状数组 (3,4,3) 的好地方。其中前两个维度对应于您的原始np.empty(3,4) 数组,最后一个维度包含您的np.random.rand(3)。这可以简单地创建为ArrayA = np.random.rand(3,4,3),然后操作np.where(ArrayA[:,:].A) 将只是np.where(ArrayA[:,:,0]
  • @Ophion:但这意味着我要一起放弃我的课程,我想避免这种情况。
  • @jorgehumberto Numpy 在这种情况下可能不是您想要的解决方案。例如,您提出的解决方案使用 numpy 会比使用列表列表更慢。

标签: python arrays class numpy min


【解决方案1】:

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

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

【讨论】:

  • 我明白你的意思,但不幸的是我不认为这对我有用。我使用 numpy 数组来存储值网格的对象实例。也许我应该使用不同的方法,比如尝试使用列表列表?
【解决方案2】:

您可以创建结构化的 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']

【讨论】:

  • 这是一个解决方案,但这意味着我的课程要全部放弃。问题是我使用的“真实”类更复杂,并且用于代码的其他部分,所以我想避免这种情况。还是谢谢!:)
  • 根据您希望对类实例执行数组操作的频率,您可以将相关字段存储在 numpy 结构化数组中,并让类实例在数组中保留索引跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多