生成子矩阵的有效方法

时间:2016-07-31 22:01:23

标签: python numpy scipy

以下是一个可以从两个给定的matry返回子级的函数。对于两个输入值,生成这些子级的位置是相同的。输入值为Numpy array。我只想知道是否有更优雅的方法来完成与此功能相同的任务类型。

def seg(ma1,ma2,size):
  rowN = len(ma1)           
  colN = len(ma1[0])         
  dim1 = random.randint(0,rowN-size)
  dim2 = random.randint(0,colN-size)
  return ma1[dim1:dim1+size,dim2:dim2+size], ma2[dim1:dim1+size,dim2:dim2+size]

2 个答案:

答案 0 :(得分:0)

作为一种替代方法,我们可以使用np.ix_创建索引范围,并使用这些索引编入输入数组,如下所示 -

idx = np.ix_(np.arange(size)+dim1,np.arange(size)+dim2)
out = ma1[idx], ma2[idx]

可以使用np.mgrid建议另一种方法来创建密集的行和列索引。这将需要比前一个更多的内存,但可能更接近原始代码。这是它的样子 -

R,C = np.mgrid[dim1:dim1+size,dim2:dim2+size]
out = ma1[R,C], ma2[R,C]

另一种将优雅“转移”到np.mgrid并将工作量推入后一个索引部分的方法就像这样 -

R,C = np.mgrid[:size,:size]
out = ma1[R+dim1,C+dim2], ma2[R+dim1,C+dim2]

答案 1 :(得分:0)

您可能希望rowN, colN = ma1.shape代替

rowN = len(ma1)
colN = len(ma1 [0])

此外,您可能希望为随机数生成器播种。