【问题标题】:Adding to Random Index添加到随机索引
【发布时间】:2022-11-29 18:07:35
【问题描述】:

我正在尝试在 PIL 图像的随机索引处添加一些值。我可以这样做

#find random row and column indices    
idx_r=random.choices(cat[:,0,0], k=int((cat.shape[0]*0.25)))
idx_c=random.choices(cat[0,:,0], k=int((cat.shape[1]*0.25)))
        
#add at those indices        
for i in idx_r:
     for j in idx_c:
           cat[i,j,:] = torch.add(cat[i,j,:], cost)

但是,对大尺寸图像执行此操作非常耗时。我不能对多维数组使用正常的屏蔽方法。有没有一种计算上更简单的方法来做到这一点?

【问题讨论】:

    标签: python arrays pytorch


    【解决方案1】:

    首先,您并没有真正“找到随机的行和列索引”。您正在做的是生成一个大小为 k 的数组,其中随机元素为 cat[:,0,0],而不是它们的索引。
    生成随机索引数组将按如下方式完成:

    idx_r=random.choices(np.arange(cat[:,0,0].shape[0]), k=int((cat.shape[0]*0.25)))
    idx_c=random.choices(np.arange(cat[0,:,0].shape[0]), k=int((cat.shape[0]*0.25)))
    

    其次,你在这里不需要torch.addcat[i, j, :] = cat[i, j, :] + cost应该有同样的效果,并且可能允许你不导入pytorch

    我会把剩下的答案留在这里,以防它对任何人都有用,但它似乎对这种状态下的原始问题没有任何用处。

    在这里,我使用How to set numpy matrix elements to a value with given indexes的答案来做一个简单的矩阵加法。

    idx_r=random.choices(np.arange(cat[:,0,0].shape[0]), k=int((cat.shape[0]*0.25)))
    idx_c=random.choices(np.arange(cat[0,:,0].shape[0]), k=int((cat.shape[0]*0.25)))
    zeros = np.zeros(cat.shape)
    zeros[idx_r[:], idx_c[:], :] = cost
    cat = np.add(cat, zeros)
    

    经过验证,这个方法似乎比你原来提出的要慢得多。事实上慢得多,我会认为这是一个错误而不是连贯的结果:

    from timeit import timeit
    setup: str = '''
    import numpy as np
    import random
    cat = np.random(500, 500, 500)
    idx_r = random.choices(np.arange(cat[:,0,0].shape[0]), k=int((cat.shape[0]*0.25)))
    idx_c = random.choices(np.arange(cat[0,:,0].shape[0]), k=int((cat.shape[0]*0.25)))
    cost = 42
    '''
    original: str = '''
    for i in idx_r:
        for j in idx_c:
            cat[i, j, :] = cat[i, j, :] + cost
    '''
    mine: str = '''
    zeros = np.zeros(cat.shape)
    zeros[idx_r[:], idx_c[:], :] = cost
    cat = np.add(cat, zeros)
    '''
    timeit(original, setup=setup, number=100) # 4.27609...
    timeit(mine, setup=setup, number=100) # 30.05506...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2015-10-01
      • 2012-10-26
      • 2019-05-25
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多