【问题标题】:Padding array elements by number multiplier in Python在Python中通过数字乘数填充数组元素
【发布时间】:2019-09-22 23:58:00
【问题描述】:

我有一个包含 字符串 值的大型一维数组,并且具有如下特征:

import numpy as np

arr = np.array(['1000.70', '2*8020.80', '2008.97', '6880.10', '10*7230.96', '7778.0'])

我想为N(int)*number(float/int) 填充并替换包含一个数字乘以另一个数字(整数乘浮点/整数)的值。

例如,我想将“2*8020.80”扩展为[8020.80, 8020.80],将“10*7230.96”扩展为[7230.96, 7230.96, 7230.96, 7230.96, 7230.96, 7230.96, 7230.96, 7230.96, 7230.96, 7230.96]

我想要的输出是:

expanded_arr = np.array(['1000.70', '8020.80', '8020.80', '2008.97', '6880.10', 
'7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', 
'7230.96', '7230.96', '7778.0'])

有没有简单的方法可以做到这一点?

我尝试np.tile() 并通过首先拆分“*”字符串转换为pd.DataFrame,但所有这些选项都迫使我从 df 到数组来回切换。

【问题讨论】:

    标签: python arrays python-3.x numpy dataframe


    【解决方案1】:

    你可以用 python 列表的方式做到这一点:

    arr = ['1000.70', '2*8020.80', '2008.97', '6880.10', '10*7230.96', '7778.0']
    temp = []
    
    for x in arr:
        if "*" in x:
            a,b = x.split("*")
            for _ in range(int(a)):
                temp.append(b)
        else:
            temp.append(x)
    
    print(temp)
    

    输出:

    ['1000.70', '8020.80', '8020.80', '2008.97', '6880.10', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7230.96', '7778.0']
    

    那么你可以这样做:

    import numpy as np
    
    expanded_arr = np.array(temp)
    

    【讨论】:

      【解决方案2】:

      类似于 Ruturaj 的回答,但使用 Numpy 函数直接在数组中进行更改。

      import numpy as np
      
      arr = np.array(['1000.70', '2*8020.80', '2008.97', '6880.10', '10*7230.96', '7778.0'])
      
      for x in range(len(arr)):
          if '*' in arr[x]:
              a, b = arr[x].split('*')
              arr = np.delete(arr, x, axis = 0) # Deletes the current element in the array
              arr = np.insert(arr, x, int(a)*(b, )) # Adds the new elements in the array
      print(arr)
      

      输出;

      ['1000.70' '8020.80' '8020.80' '2008.97' '6880.10' '7230.96' '7230.96'
       '7230.96' '7230.96' '7230.96' '7230.96' '7230.96' '7230.96' '7230.96'
       '7230.96' '7778.0']
      

      【讨论】:

        【解决方案3】:
        r = []
        for string in list(arr):
            if "*" in string:
                to_be_duplicated = string[string.find("*")+1:]
                multiple         = int(string[:string.find("*")])
                while multiple>0:
                    r.append(to_be_duplicated)
                    multiple = multiple-1
        
            else:
                r.append(string)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-15
          • 2020-03-20
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          • 2018-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多