使用沿最后两个轴的索引数组索引4D数组-NumPy/Python
我想创建一批具有多个通道的零图像,每个图像有一个给定的像素,值为1 如果图像仅按通道数编制索引,则以下代码可以很好地完成此工作:使用沿最后两个轴的索引数组索引4D数组-NumPy/Python,numpy,indexing,vectorization,Numpy,Indexing,Vectorization,我想创建一批具有多个通道的零图像,每个图像有一个给定的像素,值为1 如果图像仅按通道数编制索引,则以下代码可以很好地完成此工作: num_channels = 3 im_size = 2 images = np.zeros((num_channels, im_size, im_size)) # random locations for the ones pixels = np.random.randint(low=0, high=im_size,
num_channels = 3
im_size = 2
images = np.zeros((num_channels, im_size, im_size))
# random locations for the ones
pixels = np.random.randint(low=0, high=im_size,
size=(num_channels, 2))
images[np.arange(num_channels), pixels[:, 0], pixels[:, 1]] = 1
但是,如果要考虑批处理,类似的代码也会失败:
batch_size = 4
num_channels = 3
im_size = 2
images = np.zeros((batch_size, num_channels, im_size, im_size))
# random locations for the ones
pixels = np.random.randint(low=0, high=im_size,
size=(batch_size, num_channels, 2))
images[np.arange(batch_size), np.arange(num_channels), pixels[:, :, 0], pixels[:, :, 1]] = 1
这就产生了错误
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (4,) (3,) (4,3) (4,3)
以下代码将使用低效循环完成此工作:
batch_size = 4
num_channels = 3
im_size = 2
images = np.zeros((batch_size, num_channels, im_size, im_size))
# random locations for the ones
pixels = np.random.randint(low=0, high=im_size,
size=(batch_size, num_channels, 2))
for k in range(batch_size):
images[k, np.arange(num_channels), pixels[k, :, 0], pixels[k, :, 1]] = 1
如何获得矢量化解决方案?一个简单的矢量化解决方案是-
I,J = np.arange(batch_size)[:,None],np.arange(num_channels)
images[I, J, pixels[...,0], pixels[...,1]] = 1
获取那些I
,J
索引器的另一种更简单的方法是-
非常感谢你!我不知道这个高级索引的东西的存在!对不起,我的名声太低了,我不能投你一票。
I,J = np.ogrid[:batch_size,:num_channels]