首先,您并没有真正“找到随机的行和列索引”。您正在做的是生成一个大小为 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.add,cat[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...