【问题标题】:How could I add periodically a new element to an array so it appears after every 500th element?如何定期向数组中添加一个新元素,以便它出现在每 500 个元素之后?
【发布时间】:2022-10-19 16:38:34
【问题描述】:

如果我有一个包含 500k 个元素(仅限数字)的数组(列),我怎么能在每 500 个元素之后添加一个新元素?新数字应该是相邻元素的平均值。

例如:在元素 499 和 500 之间,一个新元素的值为(499 的值+ 500 的值)/2 等等。

a=np.array(h5py.File('/Users/Ad/Desktop//H5 Files/3D.h5', 'r')['Zone']['TOp']['data'])
output = np.column_stack((a.flatten(order="C"))
np.savetxt('merged.csv',output,delimiter=',')

提前致谢!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    实现这一点的最佳方法可能是创建一个生成器并使用该生成器创建一个新数组。插入 numpy 数组实际上是不可能的,因为数组具有固定的大小,因此您需要为每个插入创建一个新数组,这非常昂贵。使用generator,您只需遍历数组一次并只创建一个新数组。

    def insert_every_500th_element(np_array):
        prev = None
        for idx, value in enumarate(np_array):
            if idx != 0 and idx % 500 == 0: # we're at the 500th element - yield (499th + 500th value)/2
                yield (prev+value)/2
            yield value
    
    a=np.array(h5py.File('/Users/Ad/Desktop//H5 Files/3D.h5', 'r')['Zone']['TOp']['data'])
    a = np.fromiter(insert_every_500th_element(a), float)
    output = np.column_stack((a.flatten(order="C"))
    np.savetxt('merged.csv',output,delimiter=',')
    

    【讨论】:

      【解决方案2】:

      这里有两种解决方案,一种是将第 500 个元素编辑为新值,另一种是将新值插入到数组中。请注意,这不能就地发生,因此您必须覆盖现有数组。

      # if you want to edit each 500th element to a new value
      iter_num = 500; i=iter_num
      while i < len(array):
          array[i] = (array[i]+array[i-1])/2
          i += iter_num
      
      # if you want a new element inserted in position 500
      iter_num = 500; i=iter_num
      while i < len(array):
          array = np.insert(array, i, (array[i]+array[i-1])/2)
          i += iter_num + 1
      

      【讨论】:

      • 后者为先前插入的每个项目下降一个索引。您插入的索引需要再增加一,以说明您刚刚插入的项目。
      • 你是对的。插入新元素时,i 参数应该像这样递增:i += iter_num+1。编辑以反映添加的新元素
      【解决方案3】:

      您可以使用 numpy.insert,但请记住,它返回一个新数组,因为 NumPy 中的数组具有固定大小。

      >>> import numpy as np
      >>> a = np.asarray([1,2,3,4])
      >>> np.insert(a, 2, 66)
      array([ 1,  2, 66,  3,  4])
      

      【讨论】:

        猜你喜欢
        • 2021-03-20
        • 2020-06-06
        • 2011-01-15
        • 2017-08-30
        • 2014-09-21
        • 2018-05-20
        • 1970-01-01
        • 2013-10-22
        相关资源
        最近更新 更多