【发布时间】: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