在numpy数组中对某些行进行随机排序

6
我希望对一个numpy数组中的某些行进行重新排序,这些行总是连续的(例如重排第23-80行)。每一行中元素的数量可以从1个变化到100个(这样数组就实际上是1D)。
以下是示例代码,演示了如何使用方法shuffle_rows()来实现。如何设计此类方法以有效地进行重新排序?
import numpy as np
>>> a = np.arange(20).reshape(4, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

>>> shuffle_rows(a, [1, 3]) # including rows 1, 2 and 3 in the shuffling
array([[ 0,  1,  2,  3,  4],
       [15, 16, 17, 18, 19],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
1个回答

5
您可以使用 np.random.shuffle。它会对行进行打乱,而不是行内的元素。
根据文档所述:

此函数仅在多维数组的第一个索引上对数组进行打乱。

例如:
import numpy as np


def shuffle_rows(arr,rows):
    np.random.shuffle(arr[rows[0]:rows[1]+1])

a = np.arange(20).reshape(4, 5)

print(a)
# array([[ 0,  1,  2,  3,  4],
#        [ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14],
#        [15, 16, 17, 18, 19]])

shuffle_rows(a,[1,3])

print(a)
#array([[ 0,  1,  2,  3,  4],
#       [10, 11, 12, 13, 14],
#       [15, 16, 17, 18, 19],
#       [ 5,  6,  7,  8,  9]])

shuffle_rows(a,[1,3])

print(a)
#array([[ 0,  1,  2,  3,  4],
#       [10, 11, 12, 13, 14],
#       [ 5,  6,  7,  8,  9],
#       [15, 16, 17, 18, 19]])

如果我在 Python 3 中尝试使用 print(shuffle_rows(a,[1,3])),会在输出中得到 "None"? - pir
1
洗牌是在原地进行的。打印(a),你会看到被洗牌的行。 - tmdavison
啊,明白了。感谢澄清! - pir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接