如何将python矩阵中的12个随机0变为1
How to change 12 random 0 to 1 in python Matrix
我的程序假设将 python 6x6 矩阵中随机位置的 12 个零更改为 1。
这是我的代码。
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
所以我的矩阵在开始时看起来像这样
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
所以我随机选择了一个数组和所选数组中的元素。
问题是每次都会更改不同数量的零。不像我希望他们改变的那样 12。
有谁知道如何解决这个问题?
问题在于 index1
和 index2
这两个索引是随机选择并替换的,因此一对索引可以出现不止一次。这意味着一个值将被设置为 1 两次或更多次。
一个稍微复杂的方法是创建一个包含所有可能索引的列表,然后从中随机选择一组。
from random import randint, sample
import itertools
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
indices = list(itertools.product(range(6), range(6))
random_indicies = sample(indices, 12)
for ind in random_indicies:
if (M[ind[0]][ind[1]] == 0):
M[ind[0]][ind[1]] = 1
i+=1
print(M)
这将创建一个列表 indices
,其中包含所有可能的索引对。 sample
从中挑选 12 个,不放回,迭代并用在矩阵中。
一种慢得多但实用的方法是继续循环直到 12 个索引设置为 1
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
如果 M
中的元素未更改,则直接跳过 i+=1
,因此它会一直迭代,直到 M
中的 12 个元素被更改。
您可以创建一个长度为 36 的平面数组,随机选择 12 个索引,将索引处的值更改为 1,然后最后整形为 6x6:
import numpy as np
array = np.zeros(36)
indeces = np.random.choice(np.arange(36), 12, replace = False)
array[indeces] = 1
M = np.reshape(array, (6,6))
print(M)
所以你的代码有两个问题。首先,您在 for 循环中使用变量 i
。到完成 运行ning 时,Python 已存储变量并为其分配值 5。因此,当您 运行 您的 while-loop 时,您是从 5 开始,而不是像您希望的那样从零开始。一个简单的解决方法是使用不同的变量或再次分配 i=0
。
第二个问题是你的if
语句和i+=1
。这使您的 while 循环受到重复概率的影响,有 1/36 的机会只有 1 个零变化!在 if
语句中包含 i+=1
语句应该可以解决您的问题。
代码中的两个问题:
- 就在 while 循环之前,“i”var 的值是“5”,来自之前的 for 循环
- 您应该在 while 循环中递增“i”变量,只有当一个值从 0 变为 1 时
这是代码
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
print(M)
i=0
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
和输出
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 1, 1, 1, 0, 1], [0, 1, 0, 1, 1, 1], [0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0]]
我的程序假设将 python 6x6 矩阵中随机位置的 12 个零更改为 1。 这是我的代码。
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
所以我的矩阵在开始时看起来像这样
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
所以我随机选择了一个数组和所选数组中的元素。 问题是每次都会更改不同数量的零。不像我希望他们改变的那样 12。 有谁知道如何解决这个问题?
问题在于 index1
和 index2
这两个索引是随机选择并替换的,因此一对索引可以出现不止一次。这意味着一个值将被设置为 1 两次或更多次。
一个稍微复杂的方法是创建一个包含所有可能索引的列表,然后从中随机选择一组。
from random import randint, sample
import itertools
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
indices = list(itertools.product(range(6), range(6))
random_indicies = sample(indices, 12)
for ind in random_indicies:
if (M[ind[0]][ind[1]] == 0):
M[ind[0]][ind[1]] = 1
i+=1
print(M)
这将创建一个列表 indices
,其中包含所有可能的索引对。 sample
从中挑选 12 个,不放回,迭代并用在矩阵中。
一种慢得多但实用的方法是继续循环直到 12 个索引设置为 1
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
如果 M
中的元素未更改,则直接跳过 i+=1
,因此它会一直迭代,直到 M
中的 12 个元素被更改。
您可以创建一个长度为 36 的平面数组,随机选择 12 个索引,将索引处的值更改为 1,然后最后整形为 6x6:
import numpy as np
array = np.zeros(36)
indeces = np.random.choice(np.arange(36), 12, replace = False)
array[indeces] = 1
M = np.reshape(array, (6,6))
print(M)
所以你的代码有两个问题。首先,您在 for 循环中使用变量 i
。到完成 运行ning 时,Python 已存储变量并为其分配值 5。因此,当您 运行 您的 while-loop 时,您是从 5 开始,而不是像您希望的那样从零开始。一个简单的解决方法是使用不同的变量或再次分配 i=0
。
第二个问题是你的if
语句和i+=1
。这使您的 while 循环受到重复概率的影响,有 1/36 的机会只有 1 个零变化!在 if
语句中包含 i+=1
语句应该可以解决您的问题。
代码中的两个问题:
- 就在 while 循环之前,“i”var 的值是“5”,来自之前的 for 循环
- 您应该在 while 循环中递增“i”变量,只有当一个值从 0 变为 1 时
这是代码
from random import randint
M = []
i = 0
for i in range(6):
M.append([])
for j in range(6):
M[i].append(0)
print(M)
i=0
while i < 12:
index = randint(0,5)
index2 = randint(0,5)
if (M[index][index2] == 0):
M[index][index2] = 1
i+=1
print(M)
和输出
[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[0, 1, 1, 1, 0, 1], [0, 1, 0, 1, 1, 1], [0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0]]