有效替换2d数组的行或列

时间:2018-03-17 14:50:23

标签: python

我需要大量的操作来重复替换部分数组,我希望有一种有效的方法来避免循环,因为我发现2d数组切片不支持写操作。所以我构造了一个简单的函数来实现这个目标

a = np.random.rand(4,4)
b = np.random.rand(4)
c = [1,1,1,1]

def ravel_index(a,b,row_index,col_index,order='c'):
    rindex = row_index * a.shape[1] + col_index
    lindex = rindex + b.ravel().shape[0]
    return rindex,lindex

f,l = ravel_index(a,b,1,0)
a.ravel()[f:l]=c

print (a) 

>>>[[ 0.013631517  0.81654666   0.96975073   0.832641632]
   [ 1.           1.           1.           1.         ]
   [ 0.092047737  0.149801674  0.322049501  0.162026284]
   [ 0.490197753  0.54935894   0.527087062  0.126544099]]

现在看起来很理想,但是当试图在列方向上写时..

f,l = ravel_index(a,b,1,0)
a.ravel('F')[f:l]=c

print (a) 

>>>[[ 0.306372691  0.586445896  0.052487946  0.864993735]
    [ 0.873470159  0.762572666  0.986864265  0.803903923]
    [ 0.000208709  0.579103322  0.811386673  0.196167481]
    [ 0.928682626  0.707539068  0.752064295  0.564061717]]

显然数组是复制的,我不知道如何解决这个问题,希望得到帮助谢谢

1 个答案:

答案 0 :(得分:1)

int OptionA() { cout << "OPTION A"; _getch(); return 0; } 的{​​{3}}提及

  

仅在需要时制作副本

这意味着numpy.ravel将不是您正在寻找的解决方案。如果您认为所有内容都是ravel('F'),那么您可以修改'C'函数:

ravel_index

E.g。

def ravel_index(a,c,row_index,col_index,order='c'):

    rindex = row_index * a.shape[1] + col_index
    if order == 'c':
        lindex = rindex + b.ravel().shape[0]
        return range(rindex, lindex)
    elif order == 'f':
        lindex = rindex + a.shape[1]*np.ravel(c).shape[0]
        return (None, range(rindex, lindex, a.shape[1]))