Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中洗牌数组_Python_Arrays_Python 3.x - Fatal编程技术网

在python中洗牌数组

在python中洗牌数组,python,arrays,python-3.x,Python,Arrays,Python 3.x,我有这个阵列: arr=[[1,1,1],[0,0,0],[0,0,0] 我想在第二、第三和第一行随机分配1 例如,想要的结果是: arr=[[1,1,0],[0,0,0],[0,1,0] or arr=[[1,0,0],[0,0,1],[0,1,0] 然而,使用 np.random.shuffle(arr) 结果是洗牌行而不是元素。您可以创建一个扩展列表,洗牌,然后再次分组,如下所示: import numpy as np arr=[[1,1,1],[0,0,0],[0,0,0]]

我有这个阵列:

arr=[[1,1,1],[0,0,0],[0,0,0]
我想在第二、第三和第一行随机分配1

例如,想要的结果是:

arr=[[1,1,0],[0,0,0],[0,1,0] or arr=[[1,0,0],[0,0,1],[0,1,0]
然而,使用

np.random.shuffle(arr)

结果是洗牌行而不是元素。

您可以创建一个扩展列表,洗牌,然后再次分组,如下所示:

import numpy as np

arr=[[1,1,1],[0,0,0],[0,0,0]]

extended_array = []
for array in arr:
    extended_array.extend(array)

np.random.shuffle(extended_array)

arr = list(zip(*[iter(extended_array)] * 3))

print(arr)
可能的产出:

[(0, 0, 0), (0, 0, 1), (1, 0, 1)]

通过一个例子扩展我的评论,利用和-正如Lucas已经提供的numpy解决方案:

import random
from itertools import chain 

arr=[[1,1,0],[0,0,0],[0,1,0]]    

# make it a 1-dim list
chained = list(chain.from_iterable(arr))

# shuffle it 
random.shuffle(chained)

# repartition it again
new = [chained[i:i+3] for i in range(0,9,3)]

print(new)
输出(多次尝试):


你可以解构你的阵列,洗牌,然后重新构建

import numpy as np

arr=[[1,1,1],[0,0,0],[0,0,0]]

flat_arr = [item for sublist in arr for item in sublist]

np.random.shuffle(flat_arr)

arr=np.array(flat_arr)

np.split(arr,3)

做一个阵列、展平、洗牌和重塑如何:

import numpy as np

arr = np.array([[1,1,1],[0,0,0],[0,0,0]])
flat = np.array(arr.flat)

np.random.shuffle(flat)

result_array = flat.reshape(arr.shape)

你可以这样做

将numpy导入为np
arr=[[1,1,1],[0,0,0],[0,0,0]]
np.随机.置换(np.数组(arr).整形(1,9)[0]).整形(3,3).tolist()
输出(您的可能不同,因为随机性):

[[0,1,1],[0,0,0],[0,0,1]]
说明:

  • np.array(x)
    将列表x转换为numpy数组
  • 重塑(1,9)
    获取
    [[1,1,1],[0,0,0],[0,0,0]]
    并返回[[
    1,1,0,0,0,0,0]]
    ,因此我们使用
    [0]
    获得它的第一个元素(整个子列表)
  • np.random.permutation(x)
    获取一个列表
    x
    ,并返回一个随机混合的副本。
    • 我们用它来代替看起来更明显的
      np.random.shuffle(x)
      ,它是破坏性的,它会将列表在适当的位置洗牌,而不是返回副本
  • 重塑(3,3)
    获取我们的
    (1,9)
    列表并将其转换回
    (3,3)
  • 最后,
    tolist()

你能旋转数组的数组,然后洗牌,现在,列,然后再旋转回来吗?做一个(9,1)洗牌,再做一次(3,3)如果这个结果允许的话,最后一列中有两个1?@quamrana我相信是这样的,就像他在问题中的例子一样。快回答我吧。也就是说,
[i:i+3]对于范围(0,9,3)内的i]
可以写得更短,如
[i:3]对于范围(3)内的i]
。另外,
list(chain.from_iterable(arr))
也可以是
list(chain(*arr))
我相信你的解决方案比我的更像python
import numpy as np

arr = np.array([[1,1,1],[0,0,0],[0,0,0]])
flat = np.array(arr.flat)

np.random.shuffle(flat)

result_array = flat.reshape(arr.shape)