我想生成一个形式为numpy的数组:
0.5*[[0, 0], [1, 1], [2, 2], ...]
我希望最终数组的dtype
为numpy.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)
这是一个好方法吗?我可以避免副本(如果确实是复制)只是为了进行类型转换吗?
答案 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 documentation,numpy
会检查某些要求以便返回视图。如果不满足这些要求,则返回副本。
您可以通过查看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
)