在Python中创建具有不同增量的数组
在Python中,我知道如何创建一个数组,从某个值a开始,将其上的每个组件递增一些m,直到它达到某个值b:在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,
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
可能。感谢您的建议,我将更新我的答案。