多维numpy数组中的索引

omvjsjqw  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(82)

提前感谢您的帮助!
我有一个4D numpy数组

a = np.random.random_integers(1,5,(2,3,3,4))
>>> a
array([[[[5, 2, 5, 3],
         [1, 3, 1, 2],
         [4, 3, 1, 2]],

        [[3, 1, 3, 5],
         [2, 5, 2, 3],
         [1, 4, 1, 3]],

        [[4, 2, 4, 3],
         [1, 3, 5, 2],
         [3, 5, 4, 4]]],

       [[[1, 1, 2, 3],
         [2, 1, 5, 3],
         [1, 5, 5, 4]],

        [[1, 2, 3, 3],
         [5, 2, 4, 3],
         [4, 3, 4, 5]],

        [[4, 3, 5, 3],
         [3, 5, 2, 4],
         [4, 3, 3, 1]]]])

字符串
我有一个3D numpy数组B,它的形状与a的最后三个维度相同,由0和1组成。

b = np.random.random_integers(0,1,(3,3,4))
>>> b
array([[[0, 0, 0, 0],
        [0, 0, 0, 1],
        [1, 0, 1, 0]],

       [[0, 1, 1, 0],
        [1, 1, 0, 1],
        [1, 1, 0, 1]],

       [[0, 0, 0, 1],
        [0, 1, 1, 0],
        [1, 0, 1, 0]]])


对于a中的每个(3,3,4)数组,我想选择数组B中相同位置的值为1的元素,并根据另一个数组c更新a中的这些值,该数组c具有a的第一维形状:

c = np.array([-1, -2])


因此,a[0,:]中的值在数组B中的值为1时将变为-1(c[0])
而a[1,:]中的值在数组B中的值为1时将变为-2(c[1])
最后我想得到一个数组,它的形状和a的形状一样,并且以一种有效的方式更新了值

>>> return 
array([[[[5, 2, 5, 3],
         [1, 3, 1, -1],
         [-1, 3, -1, 2]],

        [[3, -1, -1, 5],
         [-1, -1, 2, -1],
         [-1, -1, 1, -1]],

        [[4, 2, 4, -1],
         [1, -1, -1, 2],
         [-1, 5, -1, 4]]],

       [[[1, 1, 2, 3],
         [2, 1, 5, -2],
         [-2, 5, -2, 4]],

        [[1, -2, -2, 3],
         [-2, -2, 4, -2],
         [-2, -2, 4, -2]],

        [[4, 3, 5, -2],
         [3, -2, -2, 4],
         [-2, 3, -2, 1]]]])

7xzttuei

7xzttuei1#

使用广播和numpy.where

tmp = b[None] * c[:,None,None,None]
out = np.where(tmp, tmp, a)

字符串
或者(来自@ Ephophylaxs):

out = np.where(b, c[:, None, None, None], a)


或者,分配给a

tmp = b[None] * c[:,None,None,None]
m = tmp!=0
a[m] = tmp[m]


输出量:

array([[[[ 5,  2,  5,  3],
         [ 1,  3,  1, -1],
         [-1,  3, -1,  2]],

        [[ 3, -1, -1,  5],
         [-1, -1,  2, -1],
         [-1, -1,  1, -1]],

        [[ 4,  2,  4, -1],
         [ 1, -1, -1,  2],
         [-1,  5, -1,  4]]],

       [[[ 1,  1,  2,  3],
         [ 2,  1,  5, -2],
         [-2,  5, -2,  4]],

        [[ 1, -2, -2,  3],
         [-2, -2,  4, -2],
         [-2, -2,  4, -2]],

        [[ 4,  3,  5, -2],
         [ 3, -2, -2,  4],
         [-2,  3, -2,  1]]]])

ktecyv1j

ktecyv1j2#

直截了当地说:

for i in range(a.shape[0]):
    a[i][np.where(b)] = c[i]

print(a)

个字符

相关问题