我有一个6列的多维数组,如下所示:
[59, '591', '592', '593', '594', 1582823720],
[9, '91', '92', '93', '94', 1582823745],
[7, '71', '72', '73', '74', 1582823745],
[61, '611', '612', '613', '614', 1582823752],
[54, '541', '542', '543', '544', 1582823717],
[24, '241', '242', '243', '244', 1582823706]有没有一种简单的方法可以“垂直”地只洗牌特定的列,同时保持其他列的内容不变?
例如,假设我只需要“垂直”洗牌第2-5列,而保留第1列和第6列不变,因此结果将是:
[59, '541', '242', '243', '74', 1582823720],
[9, '591', '542', '593', '94', 1582823745],
[7, '241', '612', '543', '614', 1582823745],
[61, '611', '92', '73', '544', 1582823752],
[54, '71', '72', '613', '594', 1582823717],
[24, '91', '592', '93', '244', 1582823706]我是Python的新手,也许有一个简单的内置解决方案或某个模块可以做到这一点?
我遇到过使用random.shuffle()函数“垂直”处理整个数组行的numpy库,也许有一个只处理特定列的函数?
发布于 2020-02-28 22:57:33
你可以用numpy shuffle函数来实现
x=np.array(yourlist)
np.random.shuffle(x[:,1:5])对于水平混洗,您可以使用转置
np.random.shuffle(x.T[:,1:5])垂直混洗的示例
x = np.arange(36).reshape(6,6)
x
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
np.random.shuffle(x[:,1:5])
x
array([[ 0, 7, 8, 9, 10, 5],
[ 6, 1, 2, 3, 4, 11],
[12, 19, 20, 21, 22, 17],
[18, 25, 26, 27, 28, 23],
[24, 13, 14, 15, 16, 29],
[30, 31, 32, 33, 34, 35]])发布于 2020-02-28 22:52:31
这是一个使用numpy的代码。
data = [[59, '541', '242', '243', '74', 1582823720],
[9, '591', '542', '593', '94', 1582823745],
[7, '241', '612', '543', '614', 1582823745],
[61, '611', '92', '73', '544', 1582823752],
[54, '71', '72', '613', '594', 1582823717],
[24, '91', '592', '93', '244', 1582823706]
]
import numpy as np
import random
data_numpy = np.array(data)
def shuffle_column(matrix, col_index_to_shuffle):
"""
"""
current_data = matrix[:, col_index_to_shuffle]
random.shuffle(current_data)
matrix[:, col_index_to_shuffle] = current_data
return matrix
shuffled_matrix = shuffle_column(data_numpy, 2)
shuffled_matrix
array([['59', '541', '242', '243', '74', '1582823720'],
['9', '591', '92', '593', '94', '1582823745'],
['7', '241', '592', '543', '614', '1582823745'],
['61', '611', '612', '73', '544', '1582823752'],
['54', '71', '72', '613', '594', '1582823717'],
['24', '91', '542', '93', '244', '1582823706']], dtype='<U21')发布于 2020-02-28 22:58:36
我不确定这是否存在于其他库中,尽管我相信这样的功能应该存在。但是,我不需要numpy来做这件事:
混洗第四列的代码示例如下:
import random
# I am using pprint to beautify the output on the terminal
from pprint import pprint
arr = [[59, '591', '592', '593', '594', 1582823720],
[9, '91', '92', '93', '94', 1582823745],
[7, '71', '72', '73', '74', 1582823745],
[61, '611', '612', '613', '614', 1582823752],
[54, '541', '542', '543', '544', 1582823717],
[24, '241', '242', '243', '244', 1582823706]
]
t_arr = [*zip(*arr)]
# I am converting array elements to lists as the zip() function produce tuples instead of lists.
t_arr = [list(sub_arr) for sub_arr in t_arr]
random.shuffle(t_arr[3])
arr_b = [*zip(*t_arr)]
# Again, converting back to lists
arr_b = [list(sub_arr) for sub_arr in arr_b]
# printing out the results :)
pprint(arr_b)下面是输出:
[[59, '591', '592', '73', '594', 1582823720],
[9, '91', '92', '243', '94', 1582823745],
[7, '71', '72', '543', '74', 1582823745],
[61, '611', '612', '93', '614', 1582823752],
[54, '541', '542', '613', '544', 1582823717],
[24, '241', '242', '593', '244', 1582823706]]https://stackoverflow.com/questions/60453947
复制相似问题