在Python中使用随机函数时每次获取零

在Python中使用随机函数时每次获取零,python,Python,我这样做如下所示。最初我有一个2D数组a=[(1,2,3),(4,5,6)]。现在通过函数func,我想用随机数替换数组a两行中的所有元素。我正在尝试,但在执行函数后,我将每个元素都设置为0。有人能帮忙吗。记住,我必须通过使用这个函数func和执行这些切片操作来解决这个问题 import numpy as np import random A=np.array([(1,2,3),(4,5,6)]) def func(B): B[0:3]= np.random.random((1,3))

我这样做如下所示。最初我有一个2D数组a=[(1,2,3),(4,5,6)]。现在通过函数func,我想用随机数替换数组a两行中的所有元素。我正在尝试,但在执行函数后,我将每个元素都设置为0。有人能帮忙吗。记住,我必须通过使用这个函数func和执行这些切片操作来解决这个问题

import numpy as np
import random
A=np.array([(1,2,3),(4,5,6)])
def func(B):
    B[0:3]= np.random.random((1,3))
    return(B)
                    
for ic in range(0,2):
    A[ic,:]= func(A[ic,:])

print(A)    

构建数组
A
的方式是,它将始终具有整数。您可以使用
print(A.dtype)
进行检查。这意味着0-1之间的值将转换为零,这是一个问题,因为
np.random.rand
仅返回0到1之间的值。您可以通过以下几种方式解决此问题:

  • 使用浮动构造
    A=np.数组([(1,2,3.),(4,5,6.))
  • 显式设置数据类型
    A=np.array([(1,2,3)、(4,5,6)],dtype=np.float)
  • 铸造成浮式
    A=np.array([(1,2,3)、(4,5,6)]).astype(np.float)

  • 问题在于
    A
    是一个整数数组,而
    np.random.random
    生成的浮点数实际上小于一。将这样的数字转换为整数总是得到零

    您可以通过以下两种方式之一进行修复:

  • 使
    A
    成为
    float
    d类型的数组:

    a
    A=np.array([[1.0,2,3],[4,5,6]])

    b
    A=np.array([[1,2,3],[4,5,6]],dtype=float)

    C等等

  • 生成随机整数而不是浮点数,或至少生成将强制转换为非零整数的浮点数:

    a
    B[:]=np.random.randint(256,size=B.shape)

    b<代码>B[:]=np.random.random(B.shape)*256 C等等


  • 您的代码只需稍加修改

    import numpy as np
    from random import random
    A=np.array([(1,2,3),(4,5,6)])
    def func(B):
        B[0:3]= np.random.choice((1,3))
        return(B)
                    
    for ic in range(0,2):
    A[ic,:]= func(A[ic,:])
    
    print(A)  
    

    您可以使用np.random.choice代替np.random.random,它将生成随机数

    A
    dtype
    int64
    ,因此它只能保存整数值
    np.random.random((1,3))
    生成3个浮点数,所有浮点数都小于1,因为它的大小是
    (1,3)
    。所以,所有的浮点值都被截断为零,因为整数不能保持0到1之间的值。你的意思是说,我(在手机上)写我的东西的时候,你没有看到你发布了几乎完全相同的东西。干得好!我这么做太久了:)我删除了我的答案,因为你的答案信息量大得多。谢谢你的提醒!非常感谢非常感谢
    import numpy as np
    from random import random
    A=np.array([(1,2,3),(4,5,6)])
    def func(B):
        B[0:3]= np.random.choice((1,3))
        return(B)
                    
    for ic in range(0,2):
    A[ic,:]= func(A[ic,:])
    
    print(A)