替换阵列中的整个元素



问题假设我有以下数组tile1

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

我想用数组[1 5 10]替换每个[80 80 80]元素。我该怎么做?

我尝试过的

我试过

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

我觉得这很有用,但后来我意识到这和是一样的

print(tile1==80)

所以当我尝试时

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

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

那些不是"整个元件";,它们是称为行的记忆带。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]

这之所以有效,是因为当省略尾随索引时,它们会隐式设置为:...。这是基本索引的标准功能。您正在为(n, 3)形状的索引指定一个3元素序列。n由掩模中True元素的数量确定,而3tile1的剩余维度的形状。

这可能有效,但需要一些测试,我只是检查所有列的值是否相同。在本例中,其80

arr = array([[80, 80, 80],
[80, 80, 80],
[80, 80, 80],
[80, 80, 80]])

arr[arr.all(1)] = [1, 5, 10]

array([[ 1,  5, 10],
[ 1,  5, 10],
[ 1,  5, 10],
[ 1,  5, 10]])

最新更新