重复numpy值并指定dtype

时间:2013-11-06 12:57:45

标签: python arrays numpy

我想生成一个形式为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)

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

2 个答案:

答案 0 :(得分:2)

您只需重塑最终结果即可获得所需内容:

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的{​​{1}}属性可访问的flags属性来检查给定数组是副本还是来自他人的视图。


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

答案 1 :(得分:0)

替代方案:

 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