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