2024-04-19 01:31:07 发布
网友
下面的作业可能有什么问题,应该如何解决
n = 1000 a = np.array ([8,9,0]) Anew= np.random.random((n,n)) Adash= np.zeros((n,n))+ np.diag(np.diag(Anew)) S = Anew[a,:][:,a] Adash[a,:][:,a]= S
在这里,零数组和非Adash数组的大小是一样的。在
高级索引返回一个副本:
Adash[a,:]正在使用"advanced integer indexing"。与基本切片相反,高级索引始终返回一个副本。所以
Adash[a,:]
Adash[a,:][:,a] = ...正在修改Adash本身的副本,而不是视图。在
Adash[a,:][:,a] = ...
Adash
更糟糕的是,没有引用Adash[a,:]返回的副本,因此对副本的修改也会丢失。在
相反,您可以使用numpy.ix_:
Adash[np.ix_(a,a)] = S
例如
基本切片返回视图:
或者,如果您可以用一个基本片替换整型索引数组a,那么Adash[slice]将返回Adash的视图,然后Adash[slice][...] = val修改{}:
a
Adash[slice]
Adash[slice][...] = val
Adash[:3, :3] = S
关于为什么Adash[a,:][:,a] = ...不修改Adash的更多信息:
使用两组括号称为索引链接。 请注意,当您在没有索引链接的情况下表示赋值时,Adash会被修改,因为Adash[...] = val会导致{}被调用。在
Adash[...] = val
相反,Adash[a,:][:,a]调用返回新数组的Adash.__getitem__((a,slice(None))),我们将其称为temp,其底层数据从Adash复制。然后调用temp.__setitem__((slice(None), a)),它修改{}。Adash永远不会被修改。由于没有对temp的引用,新创建的临时数组将被垃圾回收。在
Adash[a,:][:,a]
Adash.__getitem__((a,slice(None)))
temp
temp.__setitem__((slice(None), a))
在Python中,语句末尾的分号是不必要的。在
高级索引返回一个副本:
Adash[a,:]
正在使用"advanced integer indexing"。与基本切片相反,高级索引始终返回一个副本。所以Adash[a,:][:,a] = ...
正在修改Adash
本身的副本,而不是视图。在更糟糕的是,没有引用
Adash[a,:]
返回的副本,因此对副本的修改也会丢失。在相反,您可以使用numpy.ix_:
例如
^{pr2}$基本切片返回视图:
或者,如果您可以用一个基本片替换整型索引数组}:
a
,那么Adash[slice]
将返回Adash
的视图,然后Adash[slice][...] = val
修改{关于为什么
Adash[a,:][:,a] = ...
不修改Adash的更多信息:使用两组括号称为索引链接。 请注意,当您在没有索引链接的情况下表示赋值时,}被调用。在
Adash
会被修改,因为Adash[...] = val
会导致{相反,}。
Adash[a,:][:,a]
调用返回新数组的Adash.__getitem__((a,slice(None)))
,我们将其称为temp
,其底层数据从Adash
复制。然后调用temp.__setitem__((slice(None), a))
,它修改{Adash
永远不会被修改。由于没有对temp
的引用,新创建的临时数组将被垃圾回收。在在Python中,语句末尾的分号是不必要的。在
相关问题 更多 >
编程相关推荐