【问题标题】:Repeat different elements of an array different amounts of times重复数组的不同元素不同的次数
【发布时间】:2018-04-10 12:41:09
【问题描述】:

假设我有一个经度数组,lonPorts

lonPort =np.loadtxt('LongPorts.txt',delimiter=',')

例如:

lonPort=[0,1,2,3,...]

我想重复每个元素不同的次数。我该怎么做呢?这是我尝试过的:

Repeat =[5, 3, 2, 3,...]

lonPort1=[]

for i in range (0,len(lenDates)):
   lonPort1[sum(Repeat[0:i])]=np.tile(lonPort[i],Repeat[i])

所以结果是:

lonPort1=[0,0,0,0,0,1,1,1,2,2,3,3,3,...]

我得到的错误是:

list assignment index out of range

如何消除错误并制作我的数组? 谢谢!

【问题讨论】:

    标签: python arrays numpy repeat


    【解决方案1】:

    你可以使用np.repeat():

    np.repeat(a, [5,3,2,3])
    

    例子:

    In [3]: a = np.array([0,1,2,3])
    
    In [4]: np.repeat(a, [5,3,2,3])
    Out[4]: array([0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3])
    

    【讨论】:

    • 假设 OP 实际上想要数组而不是问题中的列表。
    • @timgeb 是的,这暗示着他们使用了numpy
    【解决方案2】:

    在不依赖 numpy 的情况下,您可以创建一个生成器,它会一个一个地消耗您的项目,并重复它们所需的时间。

    x = [0, 1, 2, 3]
    repeat = [4, 3, 2, 1]
    
    def repeat_items(x, repeat):
      for item, r in zip(x, repeat):
        while r > 0:
          yield item
          r -= 1
    
    
    for value in repeat_items(x, repeat):
      print(value, end=' ')
    

    显示0 0 0 0 1 1 1 2 2 3

    【讨论】:

    • 我会把 while r > 0 写成 for _ in range(r) 并去掉 r -= 1
    【解决方案3】:

    为可能想要使用列表的未来读者提供无 numpy 的解决方案。

    >>> lst = [0,1,2,3]
    >>> repeat = [5, 3, 2, 3]
    >>> [x for sub in ([x]*y for x,y in zip(lst, repeat)) for x in sub]
    [0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3]
    

    如果lst 包含可变对象,请注意pitfalls 对包含可变元素的序列的序列乘法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2023-02-19
      相关资源
      最近更新 更多