python - 如何有效地改变数组中的某些值?
问题描述
给定一个初始二维数组:
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 数组,但相同的值有可能多次变异 =(
而且我认为这不是有效的,它只适用于二维数组。
有没有办法对任何形状的数组进行这种“突变”并且更有效?
“mutation”可以选择哪个值没有限制,但“mutation”的数量应严格控制在用户指定的数量。
解决方案
一种相当简单的方法是使用阵列的分解视图。您可以通过这种方式一次生成所有数字,并且更容易保证您不会在一次调用中两次处理相同的索引:
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()
因为根据文档,前者不太可能无意中复制。
当然还是有这样的可能。如果需要,您可以添加额外的支票以进行回写。一种更有效的方法是使用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
vs sorted
。
推荐阅读
- azure - 表单识别器 Azure - 无法获取 TypeError
- android - 复制可打包数据对象
- javascript - 尝试通过对象数组中动态添加的属性/值进行过滤并保存到状态
- r - 在 R 中反转 persp3D 图中的颜色
- r - facet_wrap_paginate x 轴偏离最后一页的位置
- python - 使用双向 LSTM 的形状的 ValueError
- data-analysis - Coinbase + AWS Kinesis
- php - 如何在 PHP 中将 XML 命名空间添加到父元素
- matlab - Matlab 日期时间值似乎相等但返回不相等
- flutter - 将两个 16 位寄存器转换为 32 位实值颤振