【问题标题】:Vectorized approach for breeding in a genetic algorithm遗传算法中的矢量化育种方法
【发布时间】:2020-03-03 23:35:07
【问题描述】:

我正在尝试为没有显式循环的遗传算法编码单一交叉育种方法。因此,我需要添加一行数组和另一行具有所需结果的另一个数组,如下所示。请注意,col_idx 数组选择要繁殖的特定行,而切片索引数组告诉我们在哪里切片(我想将数组的块保持在一个包含端点的位置)。

a=np.arange(20).reshape(4,5)
print('a')
print(a)
a
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
b=np.arange(20).reshape(4,5)*100
print('b')
print(b)
b
[[   0  100  200  300  400]
 [ 500  600  700  800  900]
 [1000 1100 1200 1300 1400]
 [1500 1600 1700 1800 1900]]
row_idx_a=np.array([3,1,0,3,1,3]) #edit-fixed array
row_idx_b=np.array([1,1,0,0,0,3]) #edit-fixed array to fix error identified by the answer below 
slice_idx=np.array([2,1,0,4,4,3])
merged_array=np.zeros((4,5)) ######place holder for final array

#####now some creative slicing magic so that my final array is an irregular indexed addition#######

[[  15   16   17  800  900]
 [   5    6  700  800  900]
 [   0  100  200  300  400]
 [  15   16   17   18   19]
 [   5    6    7    8    9]
 [  15   16   17   18 1900]]

我发现很难矢量化这个问题?有接盘侠吗?谢谢。

【问题讨论】:

    标签: python arrays numpy vectorization


    【解决方案1】:

    假设预期答案中的位对应于标记的数字

                                *
    row_idx_a=np.array([3,1,0,3,2,3])
    row_idx_b=np.array([2,1,0,0,0,3])
                        *
    

    错了。

    np.where(np.less.outer(slice_idx,np.arange(5)),b[row_idx_b],a[row_idx_a])
    # array([[  15,   16,   17, 1300, 1400],
    #        [   5,    6,  700,  800,  900],
    #        [   0,  100,  200,  300,  400],
    #        [  15,   16,   17,   18,   19],
    #        [  10,   11,   12,   13,   14],
    #        [  15,   16,   17,   18, 1900]])
    

    【讨论】:

    • 不错!谢谢!是的,标记的数字应该是一个(我编辑了问题并注意到了更正)
    猜你喜欢
    • 2019-06-27
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2013-07-02
    • 2021-03-03
    • 2011-05-24
    相关资源
    最近更新 更多