【发布时间】:2014-02-01 17:10:54
【问题描述】:
我正在尝试获取 numpy 二维数组的子矩阵,并对其进行修改。有时我得到一个copy,对它的修改不会影响原始数组:
In [650]: d=np.random.rand(5,5)
In [651]: may_share_memory(d, d[[0,1],:][:,[2,3]])
Out[651]: False
In [652]: d[[0,1],:][:,[2,3]]=2
In [653]: d
Out[653]:
array([[ 0.0648922 , 0.41408311, 0.88024646, 0.22471181, 0.81811439],
[ 0.32154096, 0.88349028, 0.30755883, 0.55301128, 0.61138144],
[ 0.18398833, 0.40208368, 0.69888324, 0.93197147, 0.43538379],
[ 0.55633382, 0.80531999, 0.71486132, 0.4186339 , 0.76487239],
[ 0.81193408, 0.4951559 , 0.97713937, 0.33904998, 0.27660239]])
虽然有时我似乎得到了一个视图,尽管may_share_memory 也返回False:
In [662]: d[np.ix_([0,1],[2,3])]=1
In [663]: d
Out[663]:
array([[ 0.0648922 , 0.41408311, 1. , 1. , 0.81811439],
[ 0.32154096, 0.88349028, 1. , 1. , 0.61138144],
[ 0.18398833, 0.40208368, 0.69888324, 0.93197147, 0.43538379],
[ 0.55633382, 0.80531999, 0.71486132, 0.4186339 , 0.76487239],
[ 0.81193408, 0.4951559 , 0.97713937, 0.33904998, 0.27660239]])
In [664]: may_share_memory(d, d[np.ix_([0,1],[2,3])])
Out[664]: False
更奇怪的是,如果把那个'view'赋值给一个变量,它就变成了'copy'(同样,修改不影响原始数组):
In [658]: d2=d[np.ix_([0,1],[2,3])]
In [659]: may_share_memory(d,d2)
Out[659]: False
In [660]: d2+=1
In [661]: d
Out[661]:
array([[ 0.0648922 , 0.41408311, 0.88024646, 0.22471181, 0.81811439],
[ 0.32154096, 0.88349028, 0.30755883, 0.55301128, 0.61138144],
[ 0.18398833, 0.40208368, 0.69888324, 0.93197147, 0.43538379],
[ 0.55633382, 0.80531999, 0.71486132, 0.4186339 , 0.76487239],
[ 0.81193408, 0.4951559 , 0.97713937, 0.33904998, 0.27660239]])
【问题讨论】: