我有一个二维的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循环并迭代地解决问题。
答案 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