我有一个类:
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
可能不是太优雅,但可以胜任。谢谢大家!
答案 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']