我在Python2.6.5中有一个关于numpy的奇怪问题。我分配了一个numpy数组,然后将一个新变量等效到它。当我对新数组执行任何操作时,原始数组的值也会更改。为什么会这样?请参阅下面的示例。请启发我,因为我对Python和一般编程还比较陌生。

-苏扬

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21>>> import numpy as np

>>> a = np.array([[1,2],[3,4]])

>>> b = a

>>> b

array([[1, 2],

[3, 4]])

>>> c = a

>>> c

array([[1, 2],

[3, 4]])

>>> c[:,1] = c[:,1] + 5

>>> c

array([[1, 7],

[3, 9]])

>>> b

array([[1, 7],

[3, 9]])

>>> a

array([[1, 7],

[3, 9]])

这实际上根本不是问题,而是数组(和其他对象)在Python中的工作方式。

请这样想:您在代码示例中创建的数组是一个位于内存中某个位置的对象。但是你不能在你的程序中通过告诉python在内存中的哪个位置去寻找它来使用它;你必须给它一个名字。当你写作时

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

您正在创建数组并创建引用该数组的名称a。从那时起,python就知道a指的是"内存地址0x123674283"(或其他)。python运行时中有一个包含所有这些信息的内部表(如果我记得正确的话,称为"符号表"),所以在上面一行python代码运行之后,这个表将包含

1

2

3...,

'a' : 0x123674283,

...

当您将一个变量的值赋给另一个变量时,例如

1b = a

python不会复制整个数组,因为如果它是一个大数组,则需要很长时间。相反,它会转到符号表,并将a的内存地址复制到b表中的新行。所以你最终

1

2

3

4

5...,

'a' : 0x123674283,

...,

'b' : 0x123674283,

...

你看,a和b实际上指的是内存中相同的位置,即相同的对象。您对其中一个所做的任何更改都将反映在另一个中,因为它们只是同一事物的两个名称。

如果要实际复制数组,则必须调用一个方法来显式执行该操作。numpy数组有一个copy方法,您可以仅用于此目的。所以如果你写

1b = a.copy()

然后,python将首先实际复制数组——也就是说,它留出了一个新的内存区域,比如在地址0x123904381处,然后转到内存地址0x123674283,并将数组的所有值从内存的后一部分复制到前一部分。所以你在记忆中的两个不同的地方有相同的内容。

1

2

3

4

5...,

'a' : 0x123674283,

...,

'b' : 0x123904381,

...

现在,当您更改b的一个元素时,该更改不会出现在a中,因为a和b不再指计算机内存的同一部分。由于阵列数据有两个独立的副本,因此可以更改其中一个而不影响另一个。

非常感谢您的精彩描述。不用说,这解决了问题,但我真的很感谢你花时间解释。你启发了我!

"python不会复制整个数组,因为如果它是一个大数组,则需要很长的时间。"—我想说,它所花的时间更少,如果不以这种方式实现,则需要引入一些类似于单独指针类型的东西,这些东西会使事情变得复杂。

简言之,变量赋值创建对现有对象的新引用。

1

2A = object # A points to object in memory

B = A # B points to the same object

python给矩阵赋值_关于python:numpy数组赋值问题相关推荐

  1. python进行矩阵计算公式_纯python进行矩阵的相乘运算的方法示例

    本文介绍了纯python进行矩阵的相乘运算的方法示例,分享给大家,具体如下: def matrixMultiply(A, B): # 获取A的行数和列数 A_row, A_col = shape(A) ...

  2. python计算矩阵行列式_基础 | Python 下的行列式值

    关键词:线性代数 / 矩阵 / 行列式 矩阵作为绝大多数算法的算子,当矩阵里的数字被赋予了意义,例如每个 row 表示了一个线性方程式,那么如果把这些线性方程用向量的形式在 xyz 空间坐标中表示,从 ...

  3. python如何改变数据类型_如何改变numpy数组的数据类型和形状?

    数据类型的混合使得这种转换比通常更复杂.最后的答案是,将字段复制到目标数组具有速度和通用性的结合.在 让我们构造一个示例:In [850]: dt Out[850]: dtype([('cycle', ...

  4. c语言中数组部分输入赋值,c语言scanf对数组赋值

    c语言动态数组赋值,,c语言结构体数组赋值,c语言scanf对数组赋值 c语言数组动态赋值,<手把手教你学51单片机-C语言>之六 中断与数码管动态显示,c语言结构体数组赋值,c语言sca ...

  5. c语言字符数组赋值超过,C语言字符数组赋值

    C语言字符数组赋值教程 C语言字符数组赋值详解 语法 arr[index] = value; 参数 参数 描述 arr 数组名. index 需要赋值的下标索引. value 需要设置的值. 说明 给 ...

  6. python给矩阵赋值_解决Python二维数组赋值问题

    解决Python二维数组赋值问题 当我们采用s=[[0]*3]*2初始化一个数组,然后对s[0][0]进行赋值,改变的是第一列所有的值.因为用s = [[0]*3]*2 初始化数组,他表示的是指向这个 ...

  7. python三维矩阵可视化_科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)...

    Mlab了解 Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化. 过程为: .建立数据源 .使用Filter( ...

  8. python中ndarray对象_学习python的第二十二天(numpy模块(对矩阵的处理,ndarray对象)

    6.12自我总结 一.numpy模块 import numpy as np约定俗称要把他变成np 1.模块官方文档地址 2.创建矩阵 1.np.array import numpy as np #创建 ...

  9. python 三维矩阵乘以二维矩阵_二维numpy数组的乘法/除法生成三维数组

    我正在寻找一种快速(即矢量化)的方法来替换下面的循环.我有两个numpy数组,尺寸分别为:(20738,14)和(31,14).我需要将它们元素相乘得到一个数组(20738,31,14).我一直在尝试 ...

最新文章

  1. delphi 数据库显示的TDBGrid配置
  2. vs2010启动调试、停止调试非常慢
  3. AI理论知识整理(10)-向量空间与矩阵(1)
  4. mysql-binlog日志恢复数据库
  5. MassTransit Get Started-
  6. elif else if oracle_shell中if做比较
  7. Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)
  8. QString转HTuple
  9. 《深入理解计算机系统》CSAPP第三章知识点归纳(看完一遍复习专用)
  10. 每个极客都应该知道的Linux技巧(区分开普通的Linux用户和超级极客)
  11. epoll + 非阻塞IO + openssl
  12. SQL Server——SELECT单表数据查询(二)
  13. html/css插入base64背景图片
  14. 使用nuget 打包并上传 nuget.org
  15. VSS2005的下载地址是:
  16. Alluxio Paper
  17. 浙江科技学院c语言考试试卷,浙江科技学院c语言-1-C试卷A.doc
  18. 华为鸿蒙无人驾驶,特斯拉最大的对手竟是华为?Hicar+鸿蒙OS无人驾驶技术不再一家独大!...
  19. java1到100的阶乘之和
  20. Selenium Webdriver重新使用已打开的浏览器实例

热门文章

  1. JPPNet-- 萌新的深度学习入门之路
  2. 计算机图形学是用计算机,计算机图形学作业
  3. 游戏服服务器——DB服
  4. 功夫世界 mysql启动_植物大战僵尸2功夫世界卡在启动中界面问题的解决方法
  5. SpringBoot三种方法实现定时发送邮件的案例
  6. python如何注释一段代码_Python 中如何写注释
  7. “百度Hi”制造大震荡 即时通信激变
  8. h3c msr 930 wlan配置
  9. MySQL 基础查询 ,连接查询,子查询
  10. 3行命令搞定应用流量查询