Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中创建具有不同增量的数组_Python_Arrays_Numpy - Fatal编程技术网

在Python中创建具有不同增量的数组

在Python中创建具有不同增量的数组,python,arrays,numpy,Python,Arrays,Numpy,在Python中,我知道如何创建一个数组,从某个值a开始,将其上的每个组件递增一些m,直到它达到某个值b: array=numpy.arange(a,b,m) 但是,如果我想改变呢?具体来说,我想要数组 1,2,…9,10,20,…90100200,…9001000 所以每10个分量增加10倍的增量。实现这一目标最简单的方法是什么?如果有必要,我可以使用循环并“手动”执行此操作,但有更好的方法吗?阅读起来不容易,也不美观,但这里有一个简单的说明: reduce(lambda x, y: x+y,

在Python中,我知道如何创建一个数组,从某个值a开始,将其上的每个组件递增一些m,直到它达到某个值b:

array=numpy.arange(a,b,m)

但是,如果我想改变呢?具体来说,我想要数组 1,2,…9,10,20,…90100200,…9001000


所以每10个分量增加10倍的增量。实现这一目标最简单的方法是什么?如果有必要,我可以使用循环并“手动”执行此操作,但有更好的方法吗?

阅读起来不容易,也不美观,但这里有一个简单的说明:

reduce(lambda x, y: x+y, [range(10**n, 10*10**n, 10**n) for n in range(4)])

阅读起来并不容易,也不美观,但这里有一句话:

reduce(lambda x, y: x+y, [range(10**n, 10*10**n, 10**n) for n in range(4)])

我会使用一个无限生成器:

def rudyard_steps(value=1, increment=1):
    while True:
        yield value
        value += increment
        if value % (10*increment) == 0:
            increment *= 10
现在要得到前500个左右

from itertools import islice
print(list(islice(rudyard_steps(), 500)))

我会使用一个无限生成器:

def rudyard_steps(value=1, increment=1):
    while True:
        yield value
        value += increment
        if value % (10*increment) == 0:
            increment *= 10
现在要得到前500个左右

from itertools import islice
print(list(islice(rudyard_steps(), 500)))

您可以利用numpy的优势,在几行代码中实现这一点。你可以创建一个1-9的数组,然后用一个10次幂的数组乘以它。然后将最后一个数组展平,以获得所需的列表

>>> a = np.arange(1,10)
>>> b = 10**np.arange(4)
>>> (b[:, np.newaxis] * a).flatten()

array([   1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   20,
     30,   40,   50,   60,   70,   80,   90,  100,  200,  300,  400,
    500,  600,  700,  800,  900, 1000, 2000, 3000, 4000, 5000, 6000,
   7000, 8000, 9000])

您可以利用numpy的优势,在几行代码中实现这一点。你可以创建一个1-9的数组,然后用一个10次幂的数组乘以它。然后将最后一个数组展平,以获得所需的列表

>>> a = np.arange(1,10)
>>> b = 10**np.arange(4)
>>> (b[:, np.newaxis] * a).flatten()

array([   1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   20,
     30,   40,   50,   60,   70,   80,   90,  100,  200,  300,  400,
    500,  600,  700,  800,  900, 1000, 2000, 3000, 4000, 5000, 6000,
   7000, 8000, 9000])

由于您不知道“更好的方法”,而且“手动”代码非常简短和清晰,“手动”有什么问题?对于一般情况,请使用链接的dup。对于这种特殊情况:
(10**np.arange(4)[:,None]*np.arange(1,10)).ravel()
。无法回答,因为问题已结束:这里有一个想法:
导入numpy作为np;来自itertools进口链;ar=np.fromiter(链(*(范围(10**n,10*10**n,10**n)表示范围(4)中的n)),dtype='int')
。这将只在内存中创建numpy数组,而不创建其他列表。由于您不知道“更好的方法”,而且“手动”代码非常简短明了,“手动”有什么问题?对于一般情况,请使用链接的dup。对于这种特殊情况:
(10**np.arange(4)[:,None]*np.arange(1,10)).ravel()
。无法回答,因为问题已结束:这里有一个想法:
导入numpy作为np;来自itertools进口链;ar=np.fromiter(链(*(范围(10**n,10*10**n,10**n)表示范围(4)中的n)),dtype='int')
。这将只在内存中创建您的numpy数组,而不创建其他列表。使用
10**np.arange(4)
创建
b
可能。感谢您的建议,我将更新我的答案。使用
10**np.arange(4)
创建
b
可能。感谢您的建议,我将更新我的答案。