Python numpy中的對象傳遞問題

Python numpy在slide的過程中也會有對象傳遞,也就是地址傳遞,並不是直接copy過去,這個問題困擾我一天了,詳情見下例,c數組中的第一個元素隨着第二個元素的增加而改變了.

解決方案是用c.append(np.array(a[1])),將a[1]np.array()方法重新申明爲numpy數組,因爲np.array()默認copy矩陣中的元素再創建一個新的numpy.ndarray對象,但是與之很相近的np.asarray()則不copy,這兩個方法在使用的時候要注意了,關於np.asarray()np.array()的區別,詳情見asarray vs array

# 聲明a爲3*3的矩陣 
>>> import numpy as np
>>> a=np.zeros((3,3))
>>> a
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

# 聲明b爲3*1的矩陣,並賦值給a的第一行 
>>> b=np.ones((1,3))
>>> a[1]=b
>>> a
array([[ 0.,  0.,  0.],
       [ 1.,  1.,  1.],
       [ 0.,  0.,  0.]])

# 聲明c爲空矩陣,把a的第一行append到c 
>>> c=[]
>>> c.append(a[1])
>>> c
[array([ 1.,  1.,  1.])]

# 改變b,同時賦值給a的第一行  
>>> b=np.array([1,2,3])
>>> a[1]=b
>>> a
array([[ 0.,  0.,  0.],
       [ 1.,  2.,  3.],
       [ 0.,  0.,  0.]])

# 再次把a的第一行append到c中,發現c的第一個元素也跟着改變了
>>> c.append(a[1])
>>> c
[array([ 1.,  2.,  3.]), array([ 1.,  2.,  3.])]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章