根据2D索引数组设置2D数组元素

在Python中,假设您有一个形状为零(N,4,4)的2D数组:

z = array([[[0.,0.,0.],[0.,0.]],[[0.,0.]]])

,您有一个二维索引数组:

i = array([[1,1,1],[1,0],[0,0]])

和一些有价值的2D数组:

v = array([[ 2.,4.,10.,7.],[10.,9.,2.],[ 3.,8.,8.],[ 8.,6.,1.]])

有没有一种方法可以使用z的值来填充v的元素,但要用i表示的切片中的值,而不使用循环?

注意:有没有一种方法可以以可伸缩的方式执行,因此,如果您有一个N通道数组z,其中N >> 1,则在以下情况下无需直接索引z[i]v中的值填充它?

为清楚起见,生成的z数组如下所示:

z = array([[[0.,[3.,1.]],[[2.,[8,0.]]])

很明显,使用类似这样的方法:

z = v[i,:,:]

永远不会工作,但是也许有一种方法可以使用rows,cols来做到这一点?

非常感谢!


编辑:

为清楚起见,这是一个类似的示例,但注释中要求使用3D z

z = array([[[0.,0.]]])


i = array([[2,2,1]])


v = array([[5.,5.,4.],[4.,3.],[7.,7.]])

z将变为:

z = array([[[0.,7.]],[[5.,0.]]])
luojuncai 回答:根据2D索引数组设置2D数组元素

您始终可以使用蒙版并相乘:

from numpy import array
z = array([[[0.,0.,0.],[0.,0.]],[[0.,0.]]])
i = array([[1,1,1],[1,0],[0,0]])
v = array([[ 2.,4.,10.,7.],[10.,9.,2.],[ 3.,8.,8.],[ 8.,6.,1.]])
z[0] = ~i.astype(bool)*v
z[1] = i.astype(bool)*v

输出:

z = 
array([[[ 0.,[ 0.,1.]],[[ 2.,0.]]])

对于更一般的情况:

for ax in np.unique(i):
    mask = i == ax
    z[ax] = mask*v
print(z)

输出:

[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 6. 5. 0.]]

 [[0. 5. 0. 4.]
  [4. 6. 0. 3.]
  [4. 0. 4. 8.]
  [7. 0. 0. 7.]]

 [[5. 0. 0. 0.]
  [0. 0. 8. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]

注意:这里我假设i中的值与z中的通道相同。如果不同,可以尝试以下方法代替np.unique:

for i_val,ax in zip(np.unique(i),range(z.shape[0]))::
    mask = i == i_val
    z[ax] = mask*v

编辑

单线是:

>>> z = np.array([*map(i.__eq__,np.unique(i))])*np.array([v]*z.shape[0])
>>> z
array([[[0.,5.,4.],[4.,3.],[7.,7.]],[[5.,0.]]])
,

可以使用numpy.where

z[0] = np.where(i,z[0],v)
z[1] = np.where(1 - i,z[1],v)

输出:

array([[[ 0.,0.]]])

在更新之后,如果i拥有要更改的z的索引(与示例中的0和1相反),则可以轻松地将其缩放为:

for N in range(z.shape[0]):    
    z[N] = np.where(i == N,v,z[N])

或者如果您真的想避免循环变态:

z = np.where(i == (np.where(np.ones(len(z.reshape(-1))) == 1)[0] // (z.shape[1] * z.shape[2])).reshape(z.shape),z)

输出:

array([[[0.,0.]]])
,

没有numpy的事情会更加复杂:

r = list(zip(i,v))
z[0] = [[l2[i] if l1[i]==0 else 0 for i in range(4)] for l1,l2 in r ]
z[1] = [[l2[i] if l1[i]==1 else 0 for i in range(4)] for l1,l2 in r ]
本文链接:https://www.f2er.com/3110464.html

大家都在问