python - 替换数组中的整个元素
问题描述
问题
假设我有以下数组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
解决方案
这些不是“整个元素”,它们是称为行的内存条。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)
形索引。n
由True
掩码中的元素数量决定,3
是 的剩余维度的形状tile1
。
推荐阅读
- python - Spyder 4 中的%reset - 和reset -f 有什么区别?
- python-3.x - While True 循环“if elif”语句的结果
- localhost - shopify主题本地开发的常见工作流程是什么?
- java - Gradle - 测试任务结果未缓存
- r - 为aes指定颜色渐变填充ggplot/geom_text?
- python - 如何在python文件中执行命令?
- angular - 使用 Auth0 的角度 UI 中的 localStorage 问题
- css - 有没有一种方法可以在 CSS 中将 div 的宽度设置为其高度?
- android - java.lang.RuntimeException: 传递结果失败ResultInfo{who=null,request=1,result=-1,data=Intent{dat=file:///storage/0EE6-4002/Mete/test.jpg}}
- dialogflow-es - Dialogflow @sys.phone-number 插槽在 90% 的情况下都失败了