【问题标题】:Difference between assigning any value to a[ ] and a[ : ]将任何值分配给 a[ ] 和 a[ : ]
【发布时间】:2020-08-31 05:13:24
【问题描述】:

我是图像处理的初学者,我正在使用 OpenCV 库学习它。 在使用它时,我遇到了以下代码 sn-p

import numpy as np  
img = np.zeros((300, 512, 3), np.uint8)    
img[:] = [b, g, r]

当我做img=[b,g,r]

它没有按预期工作。我知道这可能是因为数组的维度是用numpy 初始化的,但我无法将其可视化。谁能解释一下这个语法是如何工作的?

【问题讨论】:

  • b/g/r 是从哪里来的?您是否收到错误消息,如果有,您可以添加它吗?
  • 我想你会在这里找到答案stackoverflow.com/questions/29810632/…
  • 不知道您的期望,我不确定如何回答您的问题。请提供 MCVE。

标签: python numpy opencv image-processing


【解决方案1】:

img[:] 将进行就地重新分配。它实际上会将img 重新分配给整个列表,但在内存中的相同位置

如果您执行img = [b,g,r],您的变量img 仍将指向数组[b,g,r],但是,它现在指向一个全新的位置。这个想法是,如果您已经拥有img,则无需为[b,g,r] 分配新空间。

【讨论】:

  • 抱歉我弄错了我的意思是img=[b,g,r]
【解决方案2】:

让我们稍微简化一下您的示例,并定义 3 个未知数:

In [140]: b, g, r = 1,2,3                                                       
In [141]: x = np.zeros((4,2,3),int)                                             

img=[b,g,r] 只是将列表分配给变量img。您已经为该变量分配了一个值这一事实并没有什么不同。在 Python 中,我们不会“初始化”变量(有时在其他语言中会这样做)。

In [142]: [b,g,r]                                                               
Out[142]: [1, 2, 3]

将该列表分配给x[:] 会导致:

In [143]: x[:] = [b,g,r]                                                        
In [144]: x                                                                     
Out[144]: 
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]],

       [[1, 2, 3],
        [1, 2, 3]]])

列表实际上被转换为 (3,) 数组 np.array([b,g,r])。这些值被分配,因此广播:

(3,) => (1,1,3) => (4,2,3)

根据广播规则,这只有在 b,g,r 是标量时才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多