import numpy as np
value = 1
# value_list = [1, 3, 5] you can also use a list of values -> *
n_samples = 3
n_subset = 500
# Create a example array
img_arr = np.random.randint(low=0, high=5, size=(10, 30, 20))
# Choose randomly indices for the array
idx_subset = np.array([np.random.randint(high=s, size=n_subset) for s in x.shape]).T
# Get the values at the sampled positions
values_subset = img_arr[[idx_subset[:, i] for i in range(img_arr.ndim)]]
# Check which values match
idx_subset_matching_temp = np.where(values_subset == value)[0]
# idx_subset_matching_temp = np.argwhere(np.isin(values_subset, value_list)).ravel() -> *
# Get all the indices of the subset with the correct value(s)
idx_subset_matching = idx_subset[idx_subset_matching_temp, :]
# Shuffle the array of indices
np.random.shuffle(idx_subset_matching)
# Only keep as much as you need
idx_subset_matching = idx_subset_matching[:n_samples, :]
这将为您提供所需的样本。这些样本的分布应该与您使用查看数组中所有匹配项的方法相同。在这两种情况下,您都会沿着具有匹配值的所有位置获得均匀分布。
在选择子集的大小和所需的样本数量时必须小心。子集必须足够大,以便有足够的值匹配,否则它将不起作用。如果您要采样的值非常稀疏,则会出现类似的问题,那么子集的大小需要非常大(在边缘情况下是整个数组)并且您一无所获。
如果您经常从同一个数组中采样,那么存储每个值的索引也是一个好主意
indices_i = np.asarray(np.where(img_arr == i)).T
并将它们用于您的进一步计算。