【问题标题】:Problems with shuffling arrays in numpy?在 numpy 中洗牌数组的问题?
【发布时间】:2017-04-29 15:51:10
【问题描述】:

我在 numpy 中对数组进行洗牌时遇到了这个不寻常的问题

arr = np.arange(9).reshape((3, 3))
print "Original constant array"
print arr
new_arr=arr
for i in range(3):        
    np.random.shuffle(new_arr)
    print "Obtained constant array"
    print arr
    print "randomized array"
    print new_arr

arr 是我保留的原始数组,并创建了新数组new_arr 以供进一步计算。但是代码显示了这个输出

Original constant array
[[0 1 2]
 [3 4 5]
 [6 7 8]]
Obtained constant array
[[6 7 8]
 [0 1 2]
 [3 4 5]]
randomized array
[[6 7 8]
 [0 1 2]
 [3 4 5]]

我只想随机化new_arr 而不是arr。为什么会发生这种情况以及如何防止arr 改组?

【问题讨论】:

  • "创建了新数组new_arr" - 不,你没有。 new_arr=arr 不会创建新数组。请参阅nedbatchelder.com/text/names.html(但切片在列表和 NumPy 数组之间的工作方式略有不同,因此不要尝试将有关切片的部分应用于 NumPy 数组)。
  • 您可能需要创建深层副本。背景见numpy array assignment problem

标签: python arrays numpy


【解决方案1】:

使用

new_arr = np.copy(arr)

而不是

new_arr = arr

当您执行new_arr=arr 时,您基本上会为您的数组arr 创建一个引用new_arr


例如(取自numpy copy docs):

Create an array x, with a reference y and a copy z:
>>> x = np.array([1, 2, 3])
>>> y = x
>>> z = np.copy(x)

Note that, when we modify x, y changes, but not z:
>>> x[0] = 10
>>> x[0] == y[0]
True
>>> x[0] == z[0]
False

【讨论】:

    【解决方案2】:

    当您说new_arr=arr 时,它会复制引用——它不会进行深度复制。然后当你改变 arr 时,它也会改变 new_arr。

    试试new_arr = np.copy(arr)。应该可以的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 2019-12-07
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2020-02-21
      • 2013-06-28
      相关资源
      最近更新 更多