3

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

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

我希望最终数组有一个dtypeof 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)

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

4

2 回答 2

3

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

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)

但是,如文档中所述numpy检查某些要求以返回视图。如果不满足这些要求,则返回副本。

您可以通过检查属性来检查给定数组是副本还是另一个视图,该属性OWNDATA可通过.flagsndarray


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

于 2013-11-06T13:39:45.443 回答
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

%%timeit在 ipython 上使用)

于 2013-11-06T16:10:58.803 回答