Python矩阵操作
我正在使用Python中的矩阵(numpy)操作,遇到了一个有趣的观察结果 如果我有以下代码:Python矩阵操作,python,numpy,Python,Numpy,我正在使用Python中的矩阵(numpy)操作,遇到了一个有趣的观察结果 如果我有以下代码: x=matrix([[1,2],[3,4]]) y=matrix([[1.1,2.1],[3.1,4.1]]) x=y print x 然后打印[[1.1,2.1],[3.1,4.1]] 但是如果我这样做的话 x=matrix([[1,2],[3,4]]) y=matrix([[1.1,2.1],[3.1,4.1]]) x[:,:]=y[:,:] print x 然后它只打印整数部
x=matrix([[1,2],[3,4]])
y=matrix([[1.1,2.1],[3.1,4.1]])
x=y
print x
然后打印[[1.1,2.1],[3.1,4.1]]
但是如果我这样做的话
x=matrix([[1,2],[3,4]])
y=matrix([[1.1,2.1],[3.1,4.1]])
x[:,:]=y[:,:]
print x
然后它只打印整数部分,即[[1,2],[3,4]]
有人能告诉我原因吗?您的x矩阵的数据类型为int32 编辑: 更有趣的结果是:
>x=np.matrix([[1,2],[3,4]],dtype='f')
>>>y=np.矩阵([[1.1,2.1],[3.1,4.1]],dtype='f')
>>>x[:,:]=y[:,:]
>>>x
矩阵([[1.10000002,2.099999],
[3.099999,4.099999]],数据类型=float32)
但这是由python浮点错误引起的。名称
x
和y
只是可以作为对象的标签。它们不像在其他语言中那样是真正的“变量”,也没有任何类型的赋值
执行该行
x = y
只需将标签x
附加到当前指向的对象y
,并删除对其先前指向的对象的引用(如果这是唯一的引用,则可能导致旧对象被垃圾收集)。执行这一行后,x是y
返回True
,表示它们现在都指向同一个对象
线路
x[:] = y
另一方面,不只是将新标签附加到对象,而是修改现有标签,即x
所指向的标签。由于此现有对象具有项类型int32
,因此所有值都需要转换为整数。执行此行后,x是y
返回False
,表示它们指向不同的对象。
在第一种情况下,当您使用赋值x=y
时,您将x
的内存位置设置为y
的内存位置,因此基本上x
现在只是一个冗余变量,指向y
指向的内存中的同一位置。这样,看起来您正在创建矩阵的副本y
,但实际上并非如此。如果您在完成此任务后对y
进行操作,然后对print x
和print y
进行操作,您将看到它们都发生了变化
在第二种情况下,由于x
被初始化为整数矩阵,因此应用了一些自动类型转换来强制x
的每个元素的新赋值为整数。当您使用x[:,:]=y[:,:]
赋值时,实际上是在复制y
矩阵的值,但是由于x
是一个整数矩阵,Python基本上执行x[:,:]=int(y[:,:])
您可以将x
初始化为:
x=矩阵([[1.0,2.0],[3.0,4.0])
或作为:
x=matrix([[1,2],[3,4]],dtype='f')
执行x[:,:]=y[:,:]
后,您应该会看到预期的结果