【问题标题】:How do I create an array whose elements are all equal to a specified value?如何创建一个元素都等于指定值的数组?
【发布时间】:2013-01-01 16:48:35
【问题描述】:

如何创建一个数组,其中每个条目都是相同的值?我知道 numpy.ones()numpy.zeros() 对 1 和 0 执行此操作,但是 -1 呢?

例如:

>>import numpy as np
>>np.zeros((3,3))
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

>>np.ones((2,5))
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

>>np.negative_ones((2,5))
???

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    如下使用np.full()

    np.full((2, 5), -1.)
    

    返回:

    array([[-1., -1., -1., -1., -1.],
           [-1., -1., -1., -1., -1.]])
    

    【讨论】:

    • 是的。 2013 年 10 月在 numpy 1.8.0 中新增,这是在此处接受的答案之后,否则这将是唯一的答案。
    • 感谢您的回答!如果您想要不同的值但只针对行怎么办?
    【解决方案2】:

    我不知道是否有没有算术运算的好单行,但可能最快的方法是使用empty 创建一个未初始化的数组,然后使用.fill() 设置值。比较:

    >>> timeit m = np.zeros((3,3)); m += -1
    100000 loops, best of 3: 6.9 us per loop
    >>> timeit m = np.ones((3,3)); m *= -1
    100000 loops, best of 3: 9.49 us per loop
    >>> timeit m = np.zeros((3,3)); m.fill(-1)
    100000 loops, best of 3: 2.31 us per loop
    >>> timeit m = np.empty((3,3)); m[:] = -1
    100000 loops, best of 3: 3.18 us per loop
    
    >>> timeit m = np.empty((3,3)); m.fill(-1)
    100000 loops, best of 3: 2.09 us per loop
    

    但老实说,我倾向于添加到零矩阵或乘以一矩阵,因为初始化很少成为瓶颈。

    【讨论】:

    • 100000 loops, best of 3: 9.49 us per loop 为什么需要这么长时间?
    • @Ashrj, 1. 不幸的是,这些时间并不具有代表性,因为数组太小了,函数调用的开销起作用(可能是为什么它有点慢)。 2. 实际上,这些时间在版本上略有不同,但我认为使用切片(我也喜欢[...])或.fill 都很棒(并且在这里获胜)。加:可读性计数...
    • 好吧,ones 基本上是 empty + fill 有一些错误捕获,所以唯一能可能显示任何性能差异的地方是小数组大小,因为它们渐近地做完全相同的事情。
    • 现在有一个单行 np.full(),根据我在下面的回答。
    【解决方案3】:

    在我看来,这些是创建具有指定值的数组的好方法

    arr=[value for x in range(num)]

    [VALUE]*NUM

    其中 num 是数组的长度 & value 是指定的值。

    【讨论】:

      【解决方案4】:

      怎么样:

      [[-1]*n]*m
      

      n 是列数,m 是行数?

      【讨论】:

        【解决方案5】:

        -1 * np.ones((2,5))

        乘以矩阵中所需的数字即可。

        In [5]: -1 * np.ones((2,5))
        Out[5]: 
        array([[-1., -1., -1., -1., -1.],
               [-1., -1., -1., -1., -1.]])
        
        In [6]: 5 * np.ones((2,5))                                                                                                                                                                                                                  
        Out[6]:                                                                                                                                                                                                                                      
        array([[ 5.,  5.,  5.,  5.,  5.],                                                                                                                                                                                                            
               [ 5.,  5.,  5.,  5.,  5.]]) 
        

        【讨论】:

          【解决方案6】:
          foo = np.repeat(10, 50).reshape((5,10))
          

          将创建一个 10 秒的 5x10 矩阵。

          【讨论】:

            【解决方案7】:

            对于一个-1s的数组

            -1 * np.ones((2,5))
            

            与常数相乘。

            【讨论】:

              猜你喜欢
              • 2017-11-18
              • 1970-01-01
              • 2022-09-23
              • 1970-01-01
              • 2017-09-23
              • 1970-01-01
              • 2021-11-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多