【问题标题】:Repeating numpy values and specifying dtype重复 numpy 值并指定 dtype
【发布时间】:2013-11-06 12:57:45
【问题描述】:

我想生成一个 numpy 形式的数组:

0.5*[[0, 0], [1, 1], [2, 2], ...]

我希望最终数组具有 dtypenumpy.float32

这是我的尝试:

>>> import numpy as np
>>> N = 5
>>> x = np.array(np.repeat(0.5*np.arange(N), 2), np.float32)
>>> x
array([ 0. ,  0. ,  0.5,  0.5,  1. ,  1. ,  1.5,  1.5,  2. ,  2. ], dtype=float32)

这是个好方法吗?我可以避免复制(如果确实是复制的话)只是为了类型转换吗?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    你只需要重塑你的最终结果来获得你想要的:

    x = x.reshape(-1, 2)
    

    您也可以运行arange 传递dtype

    x = np.repeat(0.5*np.arange(N, dtype=np.float32), 2).reshape(-1, 2)
    

    您可以使用astype 方法轻松地将数组转换为另一种类型,该方法接受参数copy

    x.astype(np.int8, copy=False)
    

    但是,as explained in the documentationnumpy 会检查一些要求以返回视图。如果不满足这些要求,则会返回一份副本。

    您可以通过检查OWNDATA 属性来检查给定数组是副本还是来自另一个数组的视图,该属性可通过ndarrayflags 属性访问。


    编辑:更多关于检查给定数组是否是副本...

    【讨论】:

    • 您也可以将0.5*np.arange(N, dtype=np.float32) 更改为np.arange(0, 0.5*N, 0.5, dtype=np.float32) 以避免临时数组。
    • 使用非精确数据类型的 arange 通常不好(它只是容易出现浮点不准确)。之后乘以 0.5 可能更好。无论如何,这种事情与速度相关的情况可能很少。
    • @seberg:这通常是个好建议。在大多数情况下,我正是出于这个原因使用np.linspace。然而,在这种情况下,N 是一个整数,所以0.5*N 是精确的(除非N 很大),而arange 很好。 (我也同意避免临时性是一种微优化,并不是太重要。)
    【解决方案2】:

    另一种选择:

     np.array([0.5*np.arange(N, dtype=np.float32)]*2)
    

    给予:

    array([[ 0. ,  0.5,  1. ,  1.5,  2. ],
           [ 0. ,  0.5,  1. ,  1.5,  2. ]], dtype=float32)
    

    您可能想要旋转它:

    np.rot90(np.array([0.5*np.arange(N, dtype=np.float32)]*2),3)
    

    给予:

    array([[ 0. ,  0. ],
           [ 0.5,  0.5],
           [ 1. ,  1. ],
           [ 1.5,  1.5],
           [ 2. ,  2. ]], dtype=float32)
    

    注意,这比@Saullo_Castro 的回答慢:

    np.rot90(np.array([0.5*np.arange(N, dtype=np.float32)]*2),3)
    
    10000 loops, best of 3: 24.3us per loop
    
    np.repeat(0.5*np.arange(N, dtype=np.float32), 2).reshape(-1, 2)
    
    10000 loops, best of 3: 9.23 us per loop
    
    np.array(np.repeat(0.5*np.arange(N), 2), np.float32).reshape(-1, 2)
    
    10000 loops, best of 3: 10.4 us per loop
    

    (在 ipython 上使用 %%timeit

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 2011-04-13
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多