【问题标题】:Map python array into a x times longer array using each element x times使用每个元素 x 次将 python 数组映射到 x 倍长的数组
【发布时间】:2018-11-29 11:18:54
【问题描述】:

我想将列表或数组映射到python 3.x 中的数组中,输入[a,b,c] 并得到类似[a*2, a*2+1, b*2, b*2+1, c*2, c*2+1] 的结果 例如:

a = np.array([2,4,6])
result = []
for a1,a2 in zip(a*2, a*2+1):
    result = result + [a1,a2]
print(result)
# Output: [4, 5, 8, 9, 12, 13] 

一定有更好的方法。 list 和 numpy 解决方案都可以。谢谢

【问题讨论】:

  • np.add.outer(2*a, np.arange(2)).ravel()?

标签: python list numpy


【解决方案1】:

一种方法:

import numpy as np

a = np.array([2, 4, 6])
b = np.repeat(2 * a, 2)
b[1::2] += 1
print(b)
# [ 4  5  8  9 12 13]

另一种方式:

b = np.stack([2 * a, 2 * a + 1], axis=1).ravel()

编辑:

如果您想要一个允许您将数组放大任意倍数的解决方案,而不仅仅是 2,您可以使用如下函数:

import numpy as np

def make_longer(a, n):
    b = np.tile(n * a[:, np.newaxis], (1, n))
    b += np.arange(n, dtype=b.dtype)
    return b.ravel()

a = np.array([2, 4, 6])
print(make_longer(a, 2))
# [ 4  5  8  9 12 13]
print(make_longer(a, 3))
# [ 6  7  8 12 13 14 18 19 20]

【讨论】:

    【解决方案2】:

    你可以试试;

    In [1]: a = [2, 4, 6]
    
    In [2]: f1 = lambda x: x*2
    
    In [3]: f2 = lambda x:x*2+1
    
    In [4]: [f(x) for x in a for f in (f1, f2)]
    Out[4]: [4, 5, 8, 9, 12, 13]
    

    或为一个班轮

    In [4]: [f(i) for i in a for f in (lambda x: x*2, lambda x: x*2+1)]
    Out[4]: [4, 5, 8, 9, 12, 13]
    

    【讨论】:

      【解决方案3】:

      这只是python中的一行代码。

      解决方案 1

      [x for i in a for x in (2*i, 2*i + 1)]
      

      解决方案 2(地图):

      [rv for r in zip(list(map(lambda x: 2 * x, a)), list(map(lambda x: 2 * x + 1, a))) for rv in r]
      

      输入:

      >>> a = [2, 4, 6]
      

      输出:

      [4, 5, 8, 9, 12, 13]
      

      【讨论】:

        【解决方案4】:

        非常简单的方法:

        l=[2,4,6]
        r=[]                                                                                                                 
        for i in l: 
           r.extend([2*i,2*i+1])
        
        print(r)                                                                                                                
        [4, 5, 8, 9, 12, 13]
        

        或者:

        g=lambda i: (2*i,2*i+1)                                                                                              
        [ e for i in l for e in g(i) ]                                                                                       
        Out: [4, 5, 8, 9, 12, 13]
        

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-24
          相关资源
          最近更新 更多