我正在尝试使用numpy '翻译'一个工作的matlab脚本到python。
在matlab代码中生成如下变量:
GA.Ng=2; % number of genes
GA.Np=Np; % size of population
GA.NG=NG; % number of generations
GA.pc=0.5; % probability of crossover
GA.alpha=0.5; % blend ratio for crossover
GA.pm=0.1; % probability of a gene being mutated
GA.xmn=[0 0]; % vector of minimum values for unnormalized genes
GA.xmx=[5 5]; % vector of maximum values for unnormalized genes
如何在python中实现这一点?我试过了,但是没有成功:
def example1p6A(NG, Np, rf, pf):
GA = np.zeros(1, dtype = [('Ng', int),
('Np', int),
('NG', int),
('pc', int),
('alpha', float),
('pm', int),
('xmin', float),
('xmax', float)])
GA['Ng'] = 2 # Number of genes
GA['Np'] = Np # size of population
GA['NG'] = NG # number of generations
GA['pc'] = 0.5 # probability of crossover
GA['alpha'] = 0.5 # blend ratio for crossover
GA['pm'] = 0.1 # probability of a gene being mutated
GA['xmin'] = np.array([0, 0]) # vector of minimum values for unnormalised genes
GA['xmax'] = np.array([5, 5]) # vector of maximum values for unnormalised genes
# Init population:
P = np.random.rand(5,5)
#return (GA['Ng'][0], Np, rf, pf)
return P
我得到错误信息
ValueError: could not broadcast input array from shape (2) into shape (1)
在Python中,您可以使用字典:
def example1p6A(NG, Np, rf, pf):
GA = dict(Ng=2,
Np=Np,
NG=NG,
pc=0.5,
alpha=0.5,
pm=0.1,
xmn=[0, 0],
xmx=[5, 5])
P = np.random.rand(5,5)
return (GA['Ng'][0], Np, rf, pf)
问题是您将xmin
和xmax
定义为float
,但您正试图将它们分配为数组。这就是你得到错误的原因。您正在尝试从shape(2)分配一个输入数组。有"形状"的东西(1)。因此,解决方案是将xmin
和xmax
定义为float
的数组。这里有一个例子,应该使它工作。
def example1p6A(NG, Np, rf, pf):
GA = np.zeros(1, dtype = [('Ng', int),
('Np', int),
('NG', int),
('pc', int),
('alpha', float),
('pm', int),
('xmin', (float, (2,))),
('xmax', (float, (2,)))])
GA['Ng'] = 2 # Number of genes
GA['Np'] = Np # size of population
GA['NG'] = NG # number of generations
GA['pc'] = 0.5 # probability of crossover
GA['alpha'] = 0.5 # blend ratio for crossover
GA['pm'] = 0.1 # probability of a gene being mutated
GA['xmin'] = np.array([0, 0]) # vector of minimum values for unnormalised genes
GA['xmax'] = np.array([5, 5]) # vector of maximum values for unnormalised genes
# Init population:
P = np.random.rand(5,5)
#return (GA['Ng'][0], Np, rf, pf)
return P
关于这方面的更多信息,请查看此链接:
https://numpy.org/doc/stable/reference/arrays.dtypes.html