2017-03-06 132 views
0

我正在寻找一个更优雅/整洁的方式来创建一个numpy阵列数字[1e-1, 2e-1, 3e-1, ..., 1e0, 2e0, 3e0, ..., 1e3, 2e3, 3e3, ..., 8e3, 9e3, 1e4]定义numpy的阵列

最好的更优雅的方式我能想出是

a = np.arange(9)+1 
b = np.array([a*10**-1, a*10**0, a*10**1, a*10**2, a*10**3]).flatten() 
b = np.append(b, 10000) 

In [84]: b 
Out[84]: 
array([ 1.00000000e-01, 2.00000000e-01, 3.00000000e-01, 
     4.00000000e-01, 5.00000000e-01, 6.00000000e-01, 
     7.00000000e-01, 8.00000000e-01, 9.00000000e-01, 
     1.00000000e+00, 2.00000000e+00, 3.00000000e+00, 
     4.00000000e+00, 5.00000000e+00, 6.00000000e+00, 
     7.00000000e+00, 8.00000000e+00, 9.00000000e+00, 
     1.00000000e+01, 2.00000000e+01, 3.00000000e+01, 
     4.00000000e+01, 5.00000000e+01, 6.00000000e+01, 
     7.00000000e+01, 8.00000000e+01, 9.00000000e+01, 
     1.00000000e+02, 2.00000000e+02, 3.00000000e+02, 
     4.00000000e+02, 5.00000000e+02, 6.00000000e+02, 
     7.00000000e+02, 8.00000000e+02, 9.00000000e+02, 
     1.00000000e+03, 2.00000000e+03, 3.00000000e+03, 
     4.00000000e+03, 5.00000000e+03, 6.00000000e+03, 
     7.00000000e+03, 8.00000000e+03, 9.00000000e+03, 
     1.00000000e+04]) 
+2

你在这个数组中有一些重复的值(1e0,1e1,1e2,1e3) - 是否需要,或者不是? – jasonharper

+0

@jasonharper它不是,谢谢指出。编辑。 – lanery

回答

3

你可以将列表理解传递给np.array然后切断你不需要的东西。

np.array([x*(10**y) for y in range(-1,5) for x in range(1,10)])[:-8] 

array([ 1.00000000e-01, 2.00000000e-01, 3.00000000e-01, 
     4.00000000e-01, 5.00000000e-01, 6.00000000e-01, 
     7.00000000e-01, 8.00000000e-01, 9.00000000e-01, 
     1.00000000e+00, 2.00000000e+00, 3.00000000e+00, 
     4.00000000e+00, 5.00000000e+00, 6.00000000e+00, 
     7.00000000e+00, 8.00000000e+00, 9.00000000e+00, 
     1.00000000e+01, 2.00000000e+01, 3.00000000e+01, 
     4.00000000e+01, 5.00000000e+01, 6.00000000e+01, 
     7.00000000e+01, 8.00000000e+01, 9.00000000e+01, 
     1.00000000e+02, 2.00000000e+02, 3.00000000e+02, 
     4.00000000e+02, 5.00000000e+02, 6.00000000e+02, 
     7.00000000e+02, 8.00000000e+02, 9.00000000e+02, 
     1.00000000e+03, 2.00000000e+03, 3.00000000e+03, 
     4.00000000e+03, 5.00000000e+03, 6.00000000e+03, 
     7.00000000e+03, 8.00000000e+03, 9.00000000e+03, 
     1.00000000e+04]) 

或者,如果你想要做的这一切在numpy的,你可以使用矩阵乘法,与ravel压平,然后切下结束。

np.ravel(np.power(10.0, np.arange(-1,5))[:,np.newaxis]*np.arange(1,10))[:-8] 

array([ 1.00000000e-01, 2.00000000e-01, 3.00000000e-01, 
     4.00000000e-01, 5.00000000e-01, 6.00000000e-01, 
     7.00000000e-01, 8.00000000e-01, 9.00000000e-01, 
     1.00000000e+00, 2.00000000e+00, 3.00000000e+00, 
     4.00000000e+00, 5.00000000e+00, 6.00000000e+00, 
     7.00000000e+00, 8.00000000e+00, 9.00000000e+00, 
     1.00000000e+01, 2.00000000e+01, 3.00000000e+01, 
     4.00000000e+01, 5.00000000e+01, 6.00000000e+01, 
     7.00000000e+01, 8.00000000e+01, 9.00000000e+01, 
     1.00000000e+02, 2.00000000e+02, 3.00000000e+02, 
     4.00000000e+02, 5.00000000e+02, 6.00000000e+02, 
     7.00000000e+02, 8.00000000e+02, 9.00000000e+02, 
     1.00000000e+03, 2.00000000e+03, 3.00000000e+03, 
     4.00000000e+03, 5.00000000e+03, 6.00000000e+03, 
     7.00000000e+03, 8.00000000e+03, 9.00000000e+03, 
     1.00000000e+04]) 
+0

也许在创建数组'np.array([x *(10 ** y)for y in range(-1,5)for x in range(1,10)] [: - 8]我不确定哪个更有效率)。 –

3
np.array([x * 10**y for y in range(-1,4) for x in range(1,10)] + [1e4]) 
2

人们可以使用numpy.fromfunction()

import numpy as np 
a = np.fromfunction(lambda i, j: (i+1)*10**(j-1), (9, 6)).T.flatten()[:-8] 

它打印

[ 1.00000000e-01 2.00000000e-01 3.00000000e-01 4.00000000e-01 
    5.00000000e-01 6.00000000e-01 7.00000000e-01 8.00000000e-01 
    9.00000000e-01 1.00000000e+00 2.00000000e+00 3.00000000e+00 
    4.00000000e+00 5.00000000e+00 6.00000000e+00 7.00000000e+00 
    8.00000000e+00 9.00000000e+00 1.00000000e+01 2.00000000e+01 
    3.00000000e+01 4.00000000e+01 5.00000000e+01 6.00000000e+01 
    7.00000000e+01 8.00000000e+01 9.00000000e+01 1.00000000e+02 
    2.00000000e+02 3.00000000e+02 4.00000000e+02 5.00000000e+02 
    6.00000000e+02 7.00000000e+02 8.00000000e+02 9.00000000e+02 
    1.00000000e+03 2.00000000e+03 3.00000000e+03 4.00000000e+03 
    5.00000000e+03 6.00000000e+03 7.00000000e+03 8.00000000e+03 
    9.00000000e+03 1.00000000e+04] 

的优点是,这是纯numpy的,因此应相比任何列表解析技术是高度有效的。

另一个纯numpy的方法将是使用对数阵列的外积从1E-1至1E4和从1线性阵列到9

a = np.outer(np.logspace(-1, 4,6),np.arange(1, 10)).flatten()[:-8] 
1

较短:

(10**(np.arange(37)//(37/4.))).cumsum()