Python中a-= b和a = a-b之间的区别 - python

我最近应用了this解决方案来平均每N行矩阵。
尽管该解决方案总体上可行,但将其应用于7x1阵列时遇到了问题。我注意到问题出在使用-=运算符时。
举一个小例子:

import numpy as np

a = np.array([1,2,3])
b = np.copy(a)

a[1:] -= a[:-1]
b[1:] = b[1:] - b[:-1]

print a
print b

输出:

[1 1 2]
[1 1 1]

因此,对于数组,a -= ba = a - b产生不同的结果。我认为到目前为止,这两种方式是完全相同的。有什么区别?

我提到的用于汇总矩阵中每N行的方法的效果如何? 7x4矩阵而不是7x1阵列?

参考方案

注意:从1.13.0版开始,在共享内存的NumPy数组上使用就地操作不再是问题(请参阅详细信息here)。这两个操作将产生相同的结果。此答案仅适用于NumPy的早期版本。

在计算中使用数组时对其进行突变可能会导致意外结果!

在问题的示例中,用-=减法会修改a的第二个元素,然后立即在对a的第三个元素的操作中使用该修改后的第二个元素。

以下是a[1:] -= a[:-1]逐步发生的情况:

  • a是具有数据[1, 2, 3]的数组。
  • 我们对此数据有两个视图:a[1:][2, 3]a[:-1][1, 2]
  • 就地减法-=开始。从a[:-1]的第一个元素减去a[1:]的第一个元素1。这已将a修改为[1, 1, 3]。现在我们有了a[1:]是数据[1, 3]的视图,而a[:-1]是数据[1, 1]的视图(数组a的第二个元素已更改)。
  • a[:-1]现在是[1, 1],并且NumPy现在必须从a[1:]的第二个元素中减去其第二个元素1(现在不再是2!)。这使a[1:]成为值[1, 2]的视图。
  • a现在是一个具有[1, 1, 2]值的数组。
  • b[1:] = b[1:] - b[:-1]不会出现此问题,因为b[1:] - b[:-1]首先创建一个新数组,然后将该数组中的值分配给b[1:]。在减法期间它不会修改b本身,因此视图b[1:]b[:-1]不会更改。

    一般建议是,如果一个视图重叠,则应避免在一个视图和另一个视图之间进行就地修改。这包括运算符-=*=等,并在通用函数(例如outnp.subtract)中使用np.multiply参数写回数组之一。

    Python GPU资源利用 - python

    我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

    Python:图像处理可产生皱纹纸效果 - python

    也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

    Python uuid4,如何限制唯一字符的长度 - python

    在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

    Python sqlite3数据库已锁定 - python

    我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

    python:ConfigParser对象,然后再阅读一次 - python

    场景:我有一个配置文件,其中包含要执行的自动化测试的列表。这些测试是长期循环执行的。   配置文件的设计方式使ConfigParser可以读取它。由于有两个三个参数,因此我需要通过每个测试。现在,此配置文件由script(s1)调用,并且按照配置文件中的列表执行测试。Script(s1)第一次读取配置,并且在每次测试完成后都会执行。阅读两次的要求:由于可能会…