重复numpy值并指定数据类型

3

I want to generate a numpy array of the form:

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个回答

4
你只需要调整最终的结果,就能得到你想要的内容:
x = x.reshape(-1, 2)

您可以通过传递 dtype 来运行 arange
x = np.repeat(0.5*np.arange(N, dtype=np.float32), 2).reshape(-1, 2)

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

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

但是,正如文档中所解释的那样numpy会检查一些要求以返回视图。如果这些要求没有被满足,就会返回一个副本。

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


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


1
检查视图/复制:https://dev59.com/umgu5IYBdhLWcg3wfHE_ - ev-br
2
你也可以将 0.5*np.arange(N, dtype=np.float32) 更改为 np.arange(0, 0.5*N, 0.5, dtype=np.float32),以避免使用临时数组。 - Warren Weckesser
2
使用arange函数时,选择非精确数据类型通常不是一个好的选择(这很容易产生浮点误差)。最好在之后乘以0.5。无论如何,这种情况下速度相关的情况可能很少。 - seberg
1
@seberg:这通常是很好的建议。在大多数情况下,我使用np.linspace正是出于这个原因。然而,在这种情况下,N是一个整数,所以0.5*N是精确的(除非N非常大),并且arange也可以。 (我也同意避免临时变量是微观优化,不太重要。) - Warren Weckesser

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接