Python 从0到99的Numpy随机数组,包括
我试图创建一个大小为(80,10)的np数组,这样每一行都有范围为0到99的随机值 我已经做过了Python 从0到99的Numpy随机数组,包括,python,numpy,random,Python,Numpy,Random,我试图创建一个大小为(80,10)的np数组,这样每一行都有范围为0到99的随机值 我已经做过了 np.random.randint(99, size=(80, 10)) 但我希望在每一行中始终包含0和99作为值 因此,每行中已经定义了两个值,另外8个值是随机的 我将如何做到这一点?有没有办法生成一个数组大小(80,8)并将[0,99]连接到每一行,使其在末尾成为(80,10)?如果您不关心重复,请创建一个零数组,用随机数替换列1-9,并将列10设置为99 final = np.zeros(s
np.random.randint(99, size=(80, 10))
但我希望在每一行中始终包含0和99作为值
因此,每行中已经定义了两个值,另外8个值是随机的
我将如何做到这一点?有没有办法生成一个数组大小(80,8)并将[0,99]连接到每一行,使其在末尾成为(80,10)?如果您不关心重复,请创建一个零数组,用随机数替换列1-9,并将列10设置为99
final = np.zeros(shape=(80, 10))
final[:,1:9] = np.random.randint(97, size=(80, 8))+1
final[:,9] = 99
我试过一些方法,这就是我想到的
def generate_matrix(low, high, shape):
x, y = shape
values = np.random.randint(low+1, high-1, size=(x, y-2))
predefined = np.tile([low, high], (x, 1))
values = np.hstack([values, predefined])
for row in values:
np.random.shuffle(row)
return values
示例用法
>>> generate_matrix(0, 99, (5, 10))
array([[94, 0, 45, 99, 18, 31, 78, 80, 32, 17],
[28, 99, 72, 3, 0, 14, 26, 37, 41, 80],
[18, 78, 71, 40, 99, 0, 85, 91, 8, 59],
[65, 99, 0, 45, 93, 94, 16, 33, 52, 53],
[22, 76, 99, 15, 27, 64, 91, 32, 0, 82]])
我的处理方式: 生成[1,98]范围内大小为(80,8)的数组,然后为每行连接0和99。但是您可能需要0/99出现在每一行的不同索引处,因此您必须将它们洗牌。不幸的是,
np.random.shuffle()。如果您使用了np.random.shuffle(arr.T).T
,或者,您没有独立地洗牌列。除了使用Python循环之外,我还没有找到一种向量化的方法来独立地洗牌行
另一种方式:
您可以生成[1,98]范围内大小为(80,10)的数组,然后在随机索引中替换每行的值0和99。同样,如果没有Python循环,我也找不到一种方法来为每行生成唯一的索引(例如,0不会覆盖99)。因为我找不到避免Python循环的方法,所以我选择了第一种方法,这似乎更简单。创建一个矩阵80x10,随机值从0到99,同一行中没有重复项,每一行都包含0和99
import random
row99=[ n for n in range(1,99) ]
perm = [n for n in range(0,10) ]
m = []
for i in range(80):
random.shuffle(row99)
random.shuffle(perm)
r = row99[:10]
r[perm[0]] = 0
r[perm[1]] = 99
m.append(r)
print(m)
部分输出:
[
... other elements here ...
[70, 58, 0, 25, 41, 10, 90, 5, 42, 18],
[0, 57, 90, 71, 39, 65, 52, 24, 28, 77],
[55, 42, 7, 9, 32, 69, 90, 0, 64, 2],
[0, 59, 17, 35, 56, 34, 33, 37, 90, 71]]
正如Tim评论中所建议的,您可以生成一个随机值不包括0
和99
的矩阵。然后用值0
和99
替换沿第二轴的两个随机索引
rand_arr = np.random.randint(low=1, high=98, size=(80, 10))
rand_indices = np.random.rand(80,10).argsort(axis=1)[:,:2]
np.put_along_axis(rand_arr, rand_indices, [0,99], axis=1)
使用argsort
的动机是我们希望沿着第二个轴随机索引,而不需要替换。仅为值0-10生成一个随机整数矩阵,其大小为size=(80,2)
不能保证这一点
在您的场景中,您可以使用kth=2
而不是np.argsort
执行np.argpartion
。这应该更有效。您是否要求每行0和99是唯一的,或者允许与其他8个值重复?更简单的方法是随机创建所有条目,然后替换它们:arx[:,8]=0
,arx[:,9]=99
@Reti43对,我希望在另一个房间里没有任何副本8@TimRoberts我想还是用长度10生成,然后替换最后两个值?你可以用不包括0和99的随机值生成一个矩阵。然后按照上面的建议,用0和99替换随机索引。没有理由在numpy解决方案中使用循环,但这是正确的想法,但是,np.random.randint(0,10,size=(10,10))在同一行中给我们提供重复项。因此,目前除了我的解决方案外,我没有看到任何没有重复的解决方案。@Reti43现在0和99都出现了。这是迄今为止提供的最佳答案。argsort和put_沿_轴的组合是我没有想到的。不幸的是,OP继续接受了一个明确没有解释重复的答案,尽管他说他不希望有重复的答案。