My R скрипт загружает 4-мерный набор данных, который представляет собой временной ряд 3D медицинских изображений. Я использую временной ряд, чтобы создать маску для исключения вокселей (трехмерных пикселей), которые имеют значение 0 в каждый момент времени:
voxels[is.na(voxels)]=0; # just get rid of unusable data
mask=rowSums(voxels,dims=3); # 3D image that is the sum over time
mask=(mask!=0); # make binary
Итак, чтобы найти значения для каждой временной точки по индексам внутри маски, которую я хочу сделать:
indices=which(mask!=0); # find the positions of nonzeroes in the mask
voxelsfound=voxels[indices]; # find the values in the images at those positions
но это дает
> length(indices)
[1] 20483
> length(voxelsfound)
[1] 20483
так что результат только для первого момента времени. Есть ли подобный способ сформулировать это так, чтобы он возвращал и другие моменты времени (моя идея была voxelsfound=voxels[indices,]
, но это не сработало), или это возможно только с помощью цикла for или аналогичного?
В Python я бы сделал что-то подобное (используя m
для mask
и v
для voxels
), используя функцию nonzero
для непосредственного доступа к индексам:
m = m.reshape(np.prod(m.shape));
v = v.reshape(np.prod(m.shape),v.shape[3]);
v = v[:,np.nonzero(m)].squeeze();