首页 > 解决方案 > 替换数组中的整个元素

问题描述

问题 假设我有以下数组tile1

[[80 80 80]
  [80 80 80]
  [80 80 80]
  [80 80 80]]

我想[80 80 80]用数组替换每个元素[1 5 10]。我怎样才能做到这一点?

我试过的

我试过了

print(tile1==[80,80,80])

我认为这非常有用,但后来我意识到这和

print(tile1==80)

所以当我尝试

tile1[tile1==[80,80,80]]=[1,5,10]

当然失败了。我只能根据基本元素分配值,例如tile1[tile1==[80,80,80]]=5

标签: pythonnumpy

解决方案


这些不是“整个元素”,它们是称为行的内存条。Numpy 数组不像列表。列表存储对嵌套元素的引用。Numpy 数组是内存块。形状和切片表示具有不同步幅的视图,而不是多层间接。

您可以使用广播分配给切片。在这种情况下,您需要指定一个索引,用布尔值标记包含所需元素的所有行,并告诉索引填充所有列。

您的替换数组将正确广播到列。但是,让我们看一下索引。

tile1 == 80

tile1这会导致与广播相同形状的数组。==进行元素比较。这样做也是如此:

tile1 == [80, 80, 80]

那么如何为每一行而不是每个元素获得一个布尔值呢?您np.all沿适当的轴使用:

np.all(tile1 == 80, axis=1)

或者我喜欢使用方法版本来表达它:

(tile1 == 80).all(axis=1)

就是这样。生成的掩码具有与行一样多的元素tile1,因此您可以像以前一样直接使用它:

tile1[(tile1 == 80).any(1)] = [1, 5, 10]

这是有效的,因为当您省略尾随索引时,它们被隐式设置为:or ...。这是基本索引的标准功能。您正在将 3 元素序列分配给 -(n, 3)形索引。nTrue掩码中的元素数量决定,3是 的剩余维度的形状tile1


推荐阅读