用重复的2D位置递增一个Numpy 3-D数组

时间:2018-10-11 06:15:00

标签: python-3.x numpy

我有一个二维的numpy数组,如下所示,

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

我想在z位置固定的3-D体积中增加上述数组中给定的位置。想象它是x-y平面中体积的一部分。

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

3-D体积中的增量等于该位置出现在较早阵列中的次数。假设我决定增加3-D数组中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 :(得分:1)

可以提出两种使用#include <iostream> #include <future> #include <thread> #include <Windows.h> void load() { float progress = 0.0; while (progress < 1.0) { int barWidth = 70; int pos = barWidth * progress; Sleep(100); std::cout << "["; for (int i = 0; i < barWidth; i++) { if (i < pos) std::cout << "="; else if (i == pos) std::cout << ">"; else std::cout << " "; } std::cout << "]" << int(progress * 100.0) << " %\r"; std::cout.flush(); progress += 0.01; } std::cout << std::endl; } int main() { std::future<void> startLoading = std::async(std::launch::async, load); // Do something while loading... for (int i = 0; i < 100; i++) { std::cout << i << " "; } return 0; } 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