从matlab到python/numpy/的一般问题



我正在尝试使用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)

问题是您将xminxmax定义为float,但您正试图将它们分配为数组。这就是你得到错误的原因。您正在尝试从shape(2)分配一个输入数组。有"形状"的东西(1)。因此,解决方案是将xminxmax定义为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

最新更新