Python矩阵操作

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 然后它只打印整数部

我正在使用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
然后它只打印整数部分,即
[[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[:,:]
后,您应该会看到预期的结果