我有一个程序,我想在其中使用numpy来获得纯Python的最大效率。有两个类:
import numpy as np
class Individual:
def __init__(self, vector: np.ndarray) -> None:
self.value = vector
def __getitem__(self, index):
return self.value[index]
class Population:
def __init__(self, individuals=np.array([])):
self.individuals = individuals
def __getitem__(self, index):
return self.individuals[index]
ind1 = Individual(np.array([1, 2]))
ind2 = Individual(np.array([3, 4]))
population = Population(np.array([ind1, ind2]))
Population
是个体的容器。所以人口看起来像np.array[individual1, individual2, individual3, ...]
。
我想要的是在程序中使用掩码来省略循环。例如,使用这样一个数组:
mask = [[True, False], [False, True]]
作为population
对象本身上的遮罩:
population[mask] = blblblbllb...
但是我的问题是当我的群体由Individual
对象组成时,我不能使用2D切片。有什么解决方案可以使它以一种很好的方式工作并保持在这个类中吗?
我的目标是拥有让我做的功能:
population[mask] = population2[mask]
而type(population[0])
仍然是Individual
而不是np.ndarray
我试图使Individual
类似于the numpy docs中描述的自定义数组容器,并使用def __array__
,但问题是,如果我创建这样的填充
pop = Population(np.array([Individual(some_array)]))
当我尝试索引时,pop[0]
不再是一个Individual
对象,而只是一个np.ndarray
。
1条答案
按热度按时间yfjy0ee71#
如the page you linked中所述,我们可以实现
__array__
方法来指示numpy
函数如何将对象转换为numpy数组,但试图索引对象时仍然只调用其__getitem__
方法,因此我们可以将两者结合起来得到:现在这个办法行得通了:
并将给予:
如预期的那样。