遗传算法中的矢量化育种方法
Vectorized approach for breeding in a genetic algorithm
我正在尝试为没有显式循环的遗传算法编码单一交叉育种方法。所以我需要添加一个数组的一行和另一个数组的另一行以及所需的结果,如下所示。请注意,col_idx 数组选择要繁殖的特定行,而切片索引数组告诉我们切片的位置(我想将数组的块 a 保留到 an 包括端点)。
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]]
我发现很难向量化这个问题?有接盘者吗?谢谢
假设预期答案中的位与标记的数字相对应
*
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]])
我正在尝试为没有显式循环的遗传算法编码单一交叉育种方法。所以我需要添加一个数组的一行和另一个数组的另一行以及所需的结果,如下所示。请注意,col_idx 数组选择要繁殖的特定行,而切片索引数组告诉我们切片的位置(我想将数组的块 a 保留到 an 包括端点)。
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]]
我发现很难向量化这个问题?有接盘者吗?谢谢
假设预期答案中的位与标记的数字相对应
*
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]])