[英]How to efficiently mutate certain num of values in an array?
给定初始二维数组:
initial = [
[0.6711999773979187, 0.1949000060558319],
[-0.09300000220537186, 0.310699999332428],
[-0.03889999911189079, 0.2736999988555908],
[-0.6984000205993652, 0.6407999992370605],
[-0.43619999289512634, 0.5810999870300293],
[0.2825999855995178, 0.21310000121593475],
[0.5551999807357788, -0.18289999663829803],
[0.3447999954223633, 0.2071000039577484],
[-0.1995999962091446, -0.5139999985694885],
[-0.24400000274181366, 0.3154999911785126]]
目标是将数组内的一些随机值乘以随机百分比。 假设只有3个随机数被随机乘数代替,我们应该得到如下内容:
output = [
[0.6711999773979187, 0.52],
[-0.09300000220537186, 0.310699999332428],
[-0.03889999911189079, 0.2736999988555908],
[-0.6984000205993652, 0.6407999992370605],
[-0.43619999289512634, 0.5810999870300293],
[0.84, 0.21310000121593475],
[0.5551999807357788, -0.18289999663829803],
[0.3447999954223633, 0.2071000039577484],
[-0.1995999962091446, 0.21],
[-0.24400000274181366, 0.3154999911785126]]
我尝试这样做:
def mutate(array2d, num_changes):
for _ in range(num_changes):
row, col = initial.shape
rand_row = np.random.randint(row)
rand_col = np.random.randint(col)
cell_value = array2d[rand_row][rand_col]
array2d[rand_row][rand_col] = random.uniform(0, 1) * cell_value
return array2d
这适用于2D数组,但相同的值可能会多次被突变==
而且我不认为这是有效的,它仅适用于2D阵列。
有没有一种方法可以更有效地对任何形状的数组进行这种“变异”?
对于“变异”可以选择哪个值没有任何限制,但是“变异”的数量应严格限制在用户指定的数量之内。
一种相当简单的方法是使用数组的斜视图。 您可以通过这种方式一次生成所有数字,并可以更轻松地保证一次调用不会处理相同的索引两次:
def mutate(array_anyd, num_changes):
raveled = array_anyd.reshape(-1)
indices = np.random.choice(raveled.size, size=num_changes, replace=False)
values = np.random.uniform(0, 1, size=num_changes)
raveled[indices] *= values
我使用array_anyd.reshape(-1)
来支持array_anyd.ravel()
因为根据docs ,前者不太可能无意间复制。
当然仍然是这样的可能性。 您可以根据需要添加额外的支票以写回。 一种更有效的方法是使用np.unravel_index
避免创建以以下内容开头的视图:
def mutate(array_anyd, num_changes):
indices = np.random.choice(array_anyd.size, size=num_changes, replace=False)
indices = np.unravel_indices(indices, array_anyd.shape)
values = np.random.uniform(0, 1, size=num_changes)
raveled[indices] *= values
由于修改是就地完成的,因此无需返回任何内容。 按照惯例,此类函数不返回任何内容。 参见例如list.sort
与sorted
。
使用shuffle
代替random_choice
,这将是另一种解决方案。 它可以处理任何形状的数组。
def mutate(arrayIn, num_changes):
mult = np.zeros(arrayIn.ravel().shape[0])
mult[:num_changes] = np.random.uniform(0,1,num_changes)
np.random.shuffle(mult)
mult = mult.reshape(arrayIn.shape)
arrayIn = arrayIn + mult*arrayIn
return arrayIn
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.