我需要大量的操作来重复替换部分数组,我希望有一种有效的方法来避免循环,因为我发现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]]
显然数组是复制的,我不知道如何解决这个问题,希望得到帮助谢谢
答案 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]))