问题假设我有以下数组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
元素的数量确定,而3
是tile1
的剩余维度的形状。
这可能有效,但需要一些测试,我只是检查所有列的值是否相同。在本例中,其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]])