【发布时间】:2019-05-21 05:33:13
【问题描述】:
据我了解,ndarray 的深层副本应该创建 ndarray 的第二次迭代,以便更改任何一个数组都不会影响另一个数组的内容。但是,在下面的代码中,我原来的 ndarray 发生了变化:
print(data[3]) #[array([[0.00000000e+00, 3.29530000e+04],
#[4.00066376e-04, 3.29530000e+04],
#[8.00132751e-04, 3.29530000e+04],
#...,
#[1.28784461e+03, 3.47140000e+04],
#[1.28784621e+03, 3.57750000e+04],
#[1.28785381e+03, 1.92450000e+04]]),
#'CH4.VDC1']
new = np.empty_like(data)
new[:] = data
new[3][0][:,1] = 4/16421 * (data[3][0][:,1] - 33563)
print(data[3]) #[array([[ 0.00000000e+00, -1.48590220e-01],
#[ 4.00066376e-04, -1.48590220e-01],
#[ 8.00132751e-04, -1.48590220e-01],
#...,
#[ 1.28784461e+03, 2.80372694e-01],
#[ 1.28784621e+03, 5.38822240e-01],
#[ 1.28785381e+03, -3.48772913e+00]]),
#'CH4.VDC1']
数组是一个混合类型的 (5,2) 数组,里面有一个 (largenumber,2) 子数组。我只是想更改子数组,但我想知道深层副本是否也扩展到该子数组。我跑了
np.shares_memory(new, data) #false
np.might_share_memory(new,data) #false
注意我在 jupyter notebook 中运行它可能也很重要。虽然我无法想象为什么它会改变任何东西。您可以使用以下方法重新创建数据:
np.array([[[[0.00000000e+00, 2.82540000e+04],
[4.00066376e-04, 2.82530000e+04],
[8.00132751e-04, 2.82520000e+04],
[1.28784461e+03, 4.61170000e+04],
[1.28784621e+03, 3.38280000e+04],
[1.28785381e+03, 3.38230000e+04]],
'CH1.Bx'],
[[[0.00000000e+00, 2.00400000e+04],
[4.00066376e-04, 2.00400000e+04],
[8.00132751e-04, 2.00410000e+04],
[1.28784461e+03, 1.81600000e+04],
[1.28784621e+03, 1.80830000e+04],
[1.28785381e+03, 4.80200000e+03]],
'CH2.By'],
[array([[0.00000000e+00, 3.82520000e+04],
[4.00066376e-04, 3.82510000e+04],
[8.00132751e-04, 3.82510000e+04],
[1.28784461e+03, 3.42810000e+04],
[1.28784621e+03, 3.42820000e+04],
[1.28785381e+03, 3.40380000e+04]]),
'CH3.Bz'],
[[[ 0.00000000e+00, -1.48590220e-01],
[ 4.00066376e-04, -1.48590220e-01],
[ 8.00132751e-04, -1.48590220e-01],
[ 1.28784461e+03, 2.80372694e-01],
[ 1.28784621e+03, 5.38822240e-01],
[ 1.28785381e+03, -3.48772913e+00]],
'CH4.VDC1'],
[[[0.00000000e+00, 3.26760000e+04],
[4.00066376e-04, 3.26760000e+04],
[8.00132751e-04, 3.26750000e+04],
[1.28784981e+03, 3.40450000e+04],
[1.28785061e+03, 3.40420000e+04],
[1.28785141e+03, 3.40390000e+04]],
'CH5.VDC2']], dtype=object)`
【问题讨论】:
-
你能分享整个
data以便重现这个吗? -
您的对象 dtype 数组包含对内存中其他地方的对象的引用。适用于普通数值数组的复制级别不会复制这些对象。
标签: python numpy multidimensional-array deep-copy