Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地变异数组中的特定数量的值?_Python_Arrays_Numpy - Fatal编程技术网

Python 如何有效地变异数组中的特定数量的值?

Python 如何有效地变异数组中的特定数量的值?,python,arrays,numpy,Python,Arrays,Numpy,给定初始二维阵列: initial = [ [0.6711999773979187, 0.1949000060558319], [-0.09300000220537186, 0.310699999332428], [-0.03889999911189079, 0.2736999988555908], [-0.6984000205993652, 0.6407999992370605], [-0.43619999289512634, 0.5810999870300293], [0.282

给定初始二维阵列:

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
这适用于二维数组,但同一个值可能会多次发生变异=(

我不认为这是有效的,它只适用于二维阵列

有没有一种方法可以更有效地对任何形状的数组进行这种“变异”


“突变”可以选择的值没有限制,只有“突变”的数量应严格遵守用户指定的编号。

一个相当简单的方法是使用数组的展开视图。通过这种方法,您可以一次生成所有编号,并且更容易保证不会在一次调用中两次处理同一索引:

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\u anyd.reforme(-1)
来支持
array\u anyd.ravel()
,因为根据,前者不太可能无意中复制

当然仍然存在这种可能性。如果需要,您可以添加额外的支票进行回写。更有效的方法是使用以下方法避免创建视图:

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

无需返回任何内容,因为修改已经完成。按照惯例,此类函数不会返回任何内容。例如,请参见
列表。sort
vs
sorted

一种相当简单的方法是使用数组的展开视图。您可以通过这种方式一次生成所有数字,并使其更简单要保证不会在一次调用中处理同一索引两次,请执行以下操作:

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\u anyd.reforme(-1)
来支持
array\u anyd.ravel()
,因为根据,前者不太可能无意中复制

当然仍然存在这种可能性。如果需要,您可以添加额外的支票进行回写。更有效的方法是使用以下方法避免创建视图:

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
vs
sorted
使用
shuffle
而不是
random\u 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

使用
shuffle
而不是
random\u 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

尝试类似以下操作:1.分解数组;2.使用np.random.choice生成随机的唯一ID索引;3.将索引乘以np.random.uniform?最后,您可以重新塑造索引。可能不需要使用循环。@如果使用视图,coldspeed无需重新塑造。除了代码中的打字错误(
num\u changes
vs
changes
),您显示的示例很有意义,但无法与代码对应:您的代码总是缩小数字。因此,基本上您需要一个随机选择,而不需要替换任何形状数组(不仅仅是1-D)尝试类似以下操作:1.分解数组;2.使用np.random.choice生成随机的唯一ID索引;3.将索引乘以np.random.uniform?最后,您可以重新塑造索引。可能不需要使用循环。@如果使用视图,coldspeed无需重新塑造。除了代码中的打字错误(
num\u changes
vs
changes
),您显示的示例有意义,但与代码不符:您的代码总是缩小数字。因此,基本上您需要一个随机选择,而不替换任何形状数组(不仅仅是1-D)。您是对的,我喜欢您的答案,因为ravel()确实返回视图(+1)。但是,您的结果将需要重新整形为原始数组的尺寸。@coldspeed,仅当您返回它时。调用方的引用将永远不会更改形状。
ravel()
重新整形(-1)
,如果必须,两者都将毫无警告地返回副本。
ravel
仅在视图相邻时创建视图,
restrape(-1)
还可以处理这样的情况,即所有条目都可以使用一个步长进行准连续寻址。例如,如果输入是从更大的ND数组中分割出来的,则很有可能无法执行此操作,您将获得一份副本。这就是为什么您应该检查并在必要时回写。我不知道推荐的惯用法是什么但是
np.shares\u memory
A.base是B.base
浮现在脑海中。或者您可以查看
aa=array\u anyd.view()
,尝试直接设置其形状
aa.shape=-1
,如果不可能,则捕获引发的异常。@palpanzer。我想出了一个更好的选择。如果顺序不正确,索引将有点不正常,但它们一开始是随机的,所以这不重要。你是对的,我喜欢你的答案because ravel()确实返回视图(+1)。但是,您的结果需要重新调整为原始数组的尺寸。@coldspeed,仅当您返回它时。调用方的引用永远不会更改形状。
ravel()
重新调整(-1)
,如果必须,两者都将毫无警告地返回副本。
ravel
仅在视图相邻时创建视图,
restrape(-1)
还可以处理这样的情况,即所有条目都可以使用一个步长进行准连续寻址。例如,如果输入是从更大的ND数组中分割出来的,则很有可能无法执行此操作,您将获得一份副本。这就是为什么您应该检查并在必要时回写。我不知道推荐的惯用法是什么但是
np.shares\u memory
A.base是B.base
浮现在脑海中。或者您可以查看
aa=array\u anyd.view()
,尝试直接设置它的形状
aa.shape=-1
,如果不可能,捕获引发的异常。@Paul