下面代码的预期输出:
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]])
我应该怎么做才能得到所需的输出?我不允许使用循环来手动分配每个值。
**更新:**场景二:如果我想要A[[1,3],[1,3]] = inner,它会抛出异常形状不匹配:shape(2,2)的值数组无法广播到shape(2,)的索引结果。我该怎么办?
场景2的期望输出:
array([[ 0, 1, 2, 3],
[ 4, 999, 6, 999],
[ 8, 9, 10, 11],
[12, 999, 14, 999]])
2条答案
按热度按时间balp4ylt1#
具体解决方案
您可以执行以下操作以获得所需的结果:
border
的作用是定义你离边界有多远。A
的输出为:广义二维解
在上面的例子中,内部数组和外部数组在两个方向上的距离都是相同的,但是你可以定义和调整两个
border
参数来推广解决方案。例如,如果原始数组较大(10x10),你想在它的任意位置嵌入一个(3x3)数组,你可以做以下事情:A的输出是:
额外提示
您可以利用
np.full
,而不是手动写入999的数组。产生...
这可以使写入内部数组快得多。
fquxozlt2#
我将尝试演示如何索引数组的块。
使用2个列表(大小相同)进行索引,选择“对角线”:
实际上,这是选择
arr[1,1]
和arr[3,3]
,从每个列表中配对一个值。您不能将(2,2)块分配给(2,)形状。您选择了具有双重索引的块:
第一次索引返回一个副本,所以进一步尝试赋值将修改该副本,而不是原始数组。
在评论中,我建议使用两个列表进行索引:
更一般地说,我们使用一个helper函数将两个1d列表转换为
broadcast
的数组:该数组元组可以选择我们的块,并可用于设置:
你可能想回顾一下
broadcasting
的概念。它在索引时和在做数学时一样重要。同样的规则适用,例如在[56]中添加两个数组:对于这对索引列表,我们可以使用切片来选择相同的块:
[59]是一个
basic
索引的例子,而所有其他的都是advanced
索引。最后,演示作业: