【发布时间】:2020-03-09 04:50:05
【问题描述】:
在 Python 中,假设您有一个形状为零的二维数组 (N,4,4):
z = array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
你有一个二维索引数组:
i = array([[1, 1, 1, 1],
[1, 0, 0, 0],
[0, 0, 1, 1],
[1, 1, 1, 0]])
还有一些有价值的二维数组:
v = array([[ 2., 4., 10., 7.],
[10., 9., 9., 2.],
[ 3., 8., 8., 8.],
[ 8., 6., 10., 1.]])
有没有办法在不使用循环的情况下用v 的值填充z 的元素,但在i 表示的切片中?
注意:有没有办法以可扩展的方式执行此操作,这样如果您有一个 N 通道数组 z,其中 N>>1,则在填充值时不需要直接索引 z[i]来自v?
为清楚起见,生成的 z 数组如下所示:
z = array([[[0., 0., 0., 0.],
[0., 9., 9., 2.],
[3., 8., 0., 0.],
[0., 0., 0., 1.]],
[[2., 4., 10., 7.],
[10., 0., 0., 0.],
[0., 0., 8., 8.],
[8, 6., 10., 0.]]])
显然,使用类似的东西:
z = v[i,:,:]
永远不会工作,但也许有办法使用rows, cols 来做到这一点?
非常感谢!
编辑:
为了清楚起见,这里有一个类似的示例,但对于 cmets 中要求的 3D z:
z = array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
i = array([[2, 1, 2, 1],
[1, 1, 2, 1],
[1, 1, 1, 1],
[1, 0, 0, 1]])
v = array([[5., 5., 0., 4.],
[4., 6., 8., 3.],
[4., 0., 4., 8.],
[7., 6., 5., 7.]])
z 会变成:
z = array([[[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.]]])
【问题讨论】:
标签: python multidimensional-array indexing element