Увеличение массива 3-D с повторяющимися 2-D позициями - PullRequest
0 голосов
/ 11 октября 2018

У меня есть двумерный массив Numpy следующим образом:

vol_coords = np.array([[  2,  68],
                       [ 79,  30],
                       [  2,  68],
                       [ 79,  30],
                       [ 79,  30],])

Я хотел бы увеличить позиции, указанные в приведенном выше массиве, в трехмерном томе, где позиция z фиксирована.Представьте, что это кусок объема в плоскости XY.

 voxel_space = np.zeros((100, 240, 180))

Приращение в трехмерном объеме равно количеству раз, когда позиция появляется в более раннем массиве.Предположим, я решил увеличить позицию Oth Z в трехмерном массиве, тогда ожидаемые результаты будут такими, как показано ниже:

>> voxel_space[0, 2, 68]
2.0
>> voxel_space[0, 79, 30]
3.0

Я использовал следующий подход,

voxel_space[0 , vol_coords[:, 0], vol_coords[:,1]]+=1

Однако приведенный выше подход всегда дает мне значение 1.0 и не учитывает повторения в массиве vol_coords.Может кто-нибудь, пожалуйста, скажите мне, как я мог решить эту проблему.Я бы предпочел не использовать цикл for и итеративно решать проблему.

1 Ответ

0 голосов
/ 11 октября 2018

Могут быть предложены два подхода с np.add.at и np.bincount -

def addtoarray_addat(voxel_space, vol_coords, z_index=0):
    shp = voxel_space.shape 
    idx = vol_coords[:,0]*shp[2] + vol_coords[:,1] + z_index*shp[2]*shp[1]
    np.add.at(voxel_space.ravel(),idx,1)
    return voxel_space

def addtoarray_bincount(voxel_space, vol_coords, z_index=0):
    shp = voxel_space.shape
    idx = vol_coords[:,0]*shp[2] + vol_coords[:,1] + z_index*shp[2]*shp[1]
    voxel_space += np.bincount(idx, minlength=np.prod(shp)).reshape(shp)
    return voxel_space

Если мы заполняем инициализированный массив нулей, было бы проще, если вместо этого мы подаем в выходную форму -

def addtoarray_bincount_zerosinit(shp, vol_coords, z_index=0):
    # shp is shape of voxel_space, desired output
    idx = vol_coords[:,0]*shp[2] + vol_coords[:,1] + z_index*shp[2]*shp[1]
    voxel_space = np.bincount(idx, minlength=np.prod(shp)).reshape(shp)
    return voxel_space
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...