花式索引与元组

时间:2014-01-10 12:31:57

标签: python arrays numpy tuples slice

假设我在numpy中有一个100x100数组,从这个数组我想选择10个随机块(x * x) 像素并同时更改这些块的值。为每个块索引切片的最佳方法是什么?一个理想的解决方案将是以下几行,其中切片是在元组对之间进行的。

A = np.ones(100,100)
blockSize = 10

numBlocks = 15

blockCenter_Row = tuple(np.random.randint(blockSize,high=(100-blockSize),size=numBlocks))
blockCenter_Col = tuple(np.random.randint(blockSize,high=(100-blockSize),size=numBlocks))
rowLeft_Boundary = tuple((i-blockSize/2) for i in blockCenter_Row)
rowRight_Boundary = tuple((i+blockSize/2) for i in blockCenter_Row)
colLower_Boundary = tuple((i-blockSize/2) for i in blockCenter_Row)
colUpper_Boundary = tuple((i+blockSize/2) for i in blockCenter_Row)

for value in range(10):
    A[rowLeft_Boundary:rowRight_Boundary,colLower_Boundary:colUpper_Boundary] = value

1 个答案:

答案 0 :(得分:3)

我认为你可以使用as_strided()来解决问题,如果可以重叠这些块。

import pylab as pl
from numpy.lib.stride_tricks import as_strided

blockSize = 10
numBlocks = 15
n = 100
a = np.zeros((n, n))

itemsize = a.dtype.itemsize
new_shape = n-blockSize+1, n-blockSize+1, blockSize, blockSize
new_stride = itemsize*n, itemsize, itemsize*n, itemsize
b = as_strided(a, shape=new_shape, strides=new_stride)

idx0 = np.random.randint(0, b.shape[0], numBlocks)
idx1 = np.random.randint(0, b.shape[1], numBlocks)

b[idx0, idx1, :, :] = np.random.rand(numBlocks, blockSize, blockSize)*3 + np.arange(numBlocks).reshape(-1, 1, 1)

pl.imshow(a, cmap="gray", interpolation="nearest")

这是输出:

enter image description here