2013-07-24 2 views
4

Я использую операции с матрицей (numpy) в Python и натолкнулся на интересное наблюдение.Манипуляция с помощью Python

Если у меня есть следующий код:

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]]

Может кто-нибудь сказать мне reaso n для этого?

ответ

5

Имена x и y - это только ярлыки, которые вы можете использовать для объектов. Они не являются «переменными», как на других языках, и у них нет какого-либо типа, назначенного им.

Выполнение линии

x = y 

будет просто прикрепить этикетку x к объекту y в данный момент указывает и падение ссылку на объект, который он указывал ранее (возможно, в результате чего старый объект будет мусор если это была единственная ссылка). После выполнения этой строки x is y возвращает True, указывая, что они оба указывают на тот же объект сейчас.

Линия

x[:] = y 

с другой стороны, не просто прикрепить новую метку к объекту, а изменяет существующий, то один указывает x. Поскольку этот существующий объект имеет тип элемента int32, все значения должны быть преобразованы в целые числа. После выполнения этой строки x is y возвращает False, указывая, что они указывают на разные объекты.

0

вашей й матрица имеет DTYPE из int32

Edit: Более интересный результат:

>>> x = np.matrix([[1,2],[3,4]],dtype='f') 
>>> y = np.matrix([[1.1,2.1],[3.1,4.1]],dtype='f') 
>>> x[:,:] = y[:,:] 
>>> x 
matrix([[ 1.10000002, 2.0999999 ], 
     [ 3.0999999 , 4.0999999 ]], dtype=float32) 

Но это вызвано ошибкой питона поплавка.

0

В первом случае, когда вы используете назначение x = y, вы настраиваете расположение памяти x в ячейку памяти y, поэтому в основном x теперь просто лишняя переменный, указывающий на то же место в памяти, что y указывает на. Таким образом, похоже, что вы создаете копию своей матрицы y, но на самом деле это не так. Если после этого задания вы должны были работать на y, а затем print x и print y, вы увидите, что они оба изменяются.

Во втором случае, поскольку x инициализирован как целочисленная матрица, применяется некоторое автоматическое литье типов, чтобы новые значения каждого элемента x были целыми числами.Фактически вы копируете значения вашей матрицы y, когда используете назначение x[:,:] = y[:,:], но поскольку x является целочисленной матрицей, Python в основном выполняет x[:,:] = int(y[:,:]).

Вы могли бы вместо того, чтобы инициализировать x как:

x = matrix([[1.0, 2.0], [3.0, 4.0]]) 

или как:

x = matrix([[1, 2], [3, 4]], dtype='f') 

и вы должны увидеть результат, который вы ожидаете после выполнения x[:,:] = y[:,:].

Смежные вопросы