Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从0到99的Numpy随机数组,包括_Python_Numpy_Random - Fatal编程技术网

Python 从0到99的Numpy随机数组,包括

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

我试图创建一个大小为(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(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继续接受了一个明确没有解释重复的答案,尽管他说他不希望有重复的答案。