如何将矩阵中的元素重新定位到另一行中的随机空位置?
How to relocate an element in a matrix to a random empty location in another row?
假设我有一个 5*5 矩阵。
[[1. 2. 3. 4. 5.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0]]
例如:
我想得到“4”,但“5”在它前面。我需要重新定位此处不需要的“5”,并将其放置在除之前所在行之外的任何随机可用位置。
所以重定位后矩阵应该是这样的
[[0. 1. 2. 3. 4.]
[0. 0. 0. 0. 0.]
[0. 5. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
如果我需要“3”,它应该将“4”和“5”重新定位到随机位置。
请帮我解决这个问题。谢谢
在这个答案中,我假设矩阵是作为列表的列表实现的,例如
a = [[1., 2., 3., 4., 5.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]
下面的函数
接受两个参数,a
,一个作为列表列表实现的二维矩阵,n
,a[0]
中的数字(即第一行 a
) 你想右移到 a[0]
.
的末尾
idx
被分配了 a[0]
中的索引,其中出现 n
。
列表to_relocate
中的元素是n
右边a[0]
中的所有元素。
a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1]
向右移动 a[0]
的元素,用零填充左边。
然后我们将 to_relocate
中的项目随机放置到 a
中除第 0 行之外的任何行中的元素。
同时在集合do_not_remove
中记录a
中被to_relocate
中元素替换的元素对应的索引,这样我们不要尝试在 a
.
中的同一位置放置多个 to_relocate
中的元素
from random import randrange
def change_random(n, a):
# get index of n in a[0].
idx = a[0].index(n)
# values to relocate.
to_relocate = a[0][idx + 1:]
# shift a[0] right (filling left with zeros)
a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1]
# records indices corresponding to elements of a
# that have already been replaced by elements in to_relocate.
do_not_remove = set()
for num in to_relocate:
while True:
# draw indices at random from set of valid indices (not row 0)
ij = (randrange(1, len(a)), randrange(0, len(a[0])))
# if element corresponding to ij has not been previously replaced, break
if ij not in do_not_remove:
break
do_not_remove.add(ij)
a[ij[0]][ij[1]] = num
change_random(3, a)
print(a)
示例会话:
[[0.0, 0.0, 1.0, 2.0, 3.0],
[4.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],
[5.0, 0.0, 0.0, 0.0, 0.0]]
假设我有一个 5*5 矩阵。
[[1. 2. 3. 4. 5.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0]]
例如:
我想得到“4”,但“5”在它前面。我需要重新定位此处不需要的“5”,并将其放置在除之前所在行之外的任何随机可用位置。
所以重定位后矩阵应该是这样的
[[0. 1. 2. 3. 4.]
[0. 0. 0. 0. 0.]
[0. 5. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
如果我需要“3”,它应该将“4”和“5”重新定位到随机位置。
请帮我解决这个问题。谢谢
在这个答案中,我假设矩阵是作为列表的列表实现的,例如
a = [[1., 2., 3., 4., 5.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]
下面的函数
接受两个参数,
的末尾a
,一个作为列表列表实现的二维矩阵,n
,a[0]
中的数字(即第一行a
) 你想右移到a[0]
.idx
被分配了a[0]
中的索引,其中出现n
。列表
to_relocate
中的元素是n
右边a[0]
中的所有元素。a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1]
向右移动a[0]
的元素,用零填充左边。然后我们将
to_relocate
中的项目随机放置到a
中除第 0 行之外的任何行中的元素。同时在集合
中的同一位置放置多个do_not_remove
中记录a
中被to_relocate
中元素替换的元素对应的索引,这样我们不要尝试在a
.to_relocate
中的元素
from random import randrange
def change_random(n, a):
# get index of n in a[0].
idx = a[0].index(n)
# values to relocate.
to_relocate = a[0][idx + 1:]
# shift a[0] right (filling left with zeros)
a[0] = [0.] * (len(a[0]) - (idx + 1)) + a[0][:idx + 1]
# records indices corresponding to elements of a
# that have already been replaced by elements in to_relocate.
do_not_remove = set()
for num in to_relocate:
while True:
# draw indices at random from set of valid indices (not row 0)
ij = (randrange(1, len(a)), randrange(0, len(a[0])))
# if element corresponding to ij has not been previously replaced, break
if ij not in do_not_remove:
break
do_not_remove.add(ij)
a[ij[0]][ij[1]] = num
change_random(3, a)
print(a)
示例会话:
[[0.0, 0.0, 1.0, 2.0, 3.0],
[4.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],
[5.0, 0.0, 0.0, 0.0, 0.0]]