Numpy数组的特定行和列同时赋值

问题描述 投票:0回答:1

我对以下代码的预期输出:

array([[ 0,  1,  2,  3],
       [ 4,  999,  999,  7],
       [ 8,  999, 999, 11],
       [12, 13, 14, 15]])

代码:

import numpy as np
A = np.array(range(16)).reshape((4,4))
A[[1,3],:][:, [1,3]] = [[999,999],[999,999]]
print(A)

但是,这些值没有变化。输出是

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

我应该怎么做才能得到想要的输出? 我不允许使用循环手动分配每个值。

更新: 场景 2:如果我想要 A[[1,3], [1,3]] = inner,它会抛出异常形状不匹配:形状 (2,2) 的值数组无法广播到形状的索引结果(2,).我该怎么办?

场景 2 的期望输出:

array([[ 0,  1,  2,  3],
      [ 4,  999,  6,  999],
      [ 8,  9, 10, 11],
      [12, 999, 14, 999]])
python python-3.x numpy numpy-ndarray numpy-slicing
1个回答
0
投票

具体解决方案

您可以执行以下操作以获得所需的结果:

import numpy as np
A = np.array(range(16)).reshape((4,4))

inner = np.array([[999,999],[999,999]])

border = 1
A[border:border + inner.shape[0],
    border:border + inner.shape[1]] = inner
  • 为清楚起见,单独定义了内部数组。
  • border
    的要点是定义你离边界有多远。
  • A
    的输出是:
array([[  0,   1,   2,   3],
       [  4, 999, 999,   7],
       [  8, 999, 999,  11],
       [ 12,  13,  14,  15]])

广义二维解

在上面的示例中,恰好是内部阵列在外部阵列的两个方向上的距离相同的情况,但您可以定义和调整两个

border
参数以推广解决方案。例如,如果原始数组较大 (10x10),而您想在其任意位置嵌入一个 (3x3) 数组,您可以执行以下操作:

import numpy as np
A = np.array(range(100)).reshape((10,10))

inner = np.array([[999,999,999],[999,999,999],[999,999,999]])

border_1 = 1
border_2 = 4
A[border_1:border_1 + inner.shape[0],
    border_2:border_2 + inner.shape[1]] = inner

A的输出为:

array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9],
       [ 10,  11,  12,  13, 999, 999, 999,  17,  18,  19],
       [ 20,  21,  22,  23, 999, 999, 999,  27,  28,  29],
       [ 30,  31,  32,  33, 999, 999, 999,  37,  38,  39],
       [ 40,  41,  42,  43,  44,  45,  46,  47,  48,  49],
       [ 50,  51,  52,  53,  54,  55,  56,  57,  58,  59],
       [ 60,  61,  62,  63,  64,  65,  66,  67,  68,  69],
       [ 70,  71,  72,  73,  74,  75,  76,  77,  78,  79],
       [ 80,  81,  82,  83,  84,  85,  86,  87,  88,  89],
       [ 90,  91,  92,  93,  94,  95,  96,  97,  98,  99]])

额外提示

无需手动编写 999 的数组,您可以利用

np.full

np.full((3, 3), 999)

生产...

array([[999, 999, 999],
       [999, 999, 999],
       [999, 999, 999]])

这可以使写入内部数组更快。

© www.soinside.com 2019 - 2024. All rights reserved.