数组分配在numpy中?

2024-04-19 01:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的作业可能有什么问题,应该如何解决

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数组的大小是一样的。在


Tags: np作业zerosrandom数组arraydiaganew
1条回答
网友
1楼 · 发布于 2024-04-19 01:31:07

高级索引返回一个副本

Adash[a,:]正在使用"advanced integer indexing"。与基本切片相反,高级索引始终返回一个副本。所以

Adash[a,:][:,a] = ...正在修改Adash本身的副本,而不是视图。在

更糟糕的是,没有引用Adash[a,:]返回的副本,因此对副本的修改也会丢失。在


相反,您可以使用numpy.ix_:

Adash[np.ix_(a,a)] = S

例如

^{pr2}$

基本切片返回视图:

或者,如果您可以用一个基本片替换整型索引数组a,那么Adash[slice]将返回Adash的视图,然后Adash[slice][...] = val修改{}:

Adash[:3, :3] = S

关于为什么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中,语句末尾的分号是不必要的。在

相关问题 更多 >