Numpy 通过ndarray值对索引进行采样的快速解决方案

Numpy 通过ndarray值对索引进行采样的快速解决方案,numpy,simpleitk,Numpy,Simpleitk,我有一些相当大的数组要处理。我所说的“大”是指在(514514374)的范围内。我想根据像素值随机获取索引。例如,我需要一个值等于1的pixl的三维索引。所以,我列出了所有的可能性 index=np.asarray(np.where(img_arr==1)).T 这是完美的,除了运行非常慢,到了无法忍受的程度,因为数组太大了。所以我的问题是有更好的方法吗?如果我可以输入一个像素值列表,然后返回一个相应索引列表,那就更好了。例如,我想对这些像素值的索引进行采样[0,1,2],然后返回索引列表[[

我有一些相当大的数组要处理。我所说的“大”是指在
(514514374)
的范围内。我想根据像素值随机获取索引。例如,我需要一个值等于1的pixl的三维索引。所以,我列出了所有的可能性

index=np.asarray(np.where(img_arr==1)).T
这是完美的,除了运行非常慢,到了无法忍受的程度,因为数组太大了。所以我的问题是有更好的方法吗?如果我可以输入一个像素值列表,然后返回一个相应索引列表,那就更好了。例如,我想对这些像素值的索引进行采样
[0,1,2]
,然后返回索引列表
[[1,2,3],[53,215,11],[223,42,113]

由于我正在处理医学图像,因此也欢迎使用
simpletk
解决方案。所以请随意发表你的意见,谢谢

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

并将其用于进一步的计算。

np.argwhere(np.isin(a[0,1,2]))
数组中有什么类型的值?只有整数?你对这些价值观的分布有大致的了解吗?10%是一个?您可以首先随机抽取10000个值的子集,然后从更小的子集中进行选择。只涉及整数。它实际上是一个面具,40%可能是面具。但我不知道如何得到一个子集,然后从中进行选择,你愿意用公式作为答案吗?我会接受的that@scleronomic我可以对索引子集进行采样,但我不知道如何使用索引子集根据其属性对一个索引进行采样value@Divakar这是一个很好的观点,。但是与
np.where
有什么区别吗?你在这里提出了非常有说服力的理由,但我从你最后的评论中获益最多,那就是存储索引,这正是我要做的。