【问题标题】:Variable array creation using numpy operations使用 numpy 操作创建变量数组
【发布时间】:2021-03-24 22:05:46
【问题描述】:

我希望在跳过一大块数字的同时在 numpy 中创建一个可变的数字数组。例如,如果我有变量:

m = 5

k = 3

num = 50

我想创建一个以num 开始并以num - k 结束的线性间隔的numpy 数组,跳过k 数字并继续生成数组。然后重复这个过程m次。例如,上面会产生:

np.array([50, 49, 48, 47, 44, 43, 42, 41, 38, 37, 36, 35, 32, 31, 30, 29, 26, 25, 24, 23])

我怎样才能通过 Numpy 做到这一点?

【问题讨论】:

  • 我不确定你的意思。也许一些用普通 Python 列表做你想要的代码可以帮助说明这一点?
  • 我已经澄清了上面的问题
  • @J_code 29 之后应该是 26,25,24,23
  • @CutePanda 已修复
  • 步长似乎固定为一,对吗?

标签: python arrays numpy


【解决方案1】:

你可以试试:

import numpy as np

m = 5
k = 3
num = 50
np.hstack([np.arange(num - 2*i*k, num - (2*i+1)*k - 1, -1) for i in range(m)])

它给出:

array([50, 49, 48, 47, 44, 43, 42, 41, 38, 37, 36, 35, 32, 31, 30, 29, 26,
       25, 24, 23])

编辑:

@JanChristophTerasa 发布了一个答案(现已删除),该答案通过屏蔽使用 np.arange() 获得的数组的一些元素来避免 Python 循环。这是一个受该想法启发的解决方案。它的工作速度比上面的要快得多:

import numpy as np

m = 5
k = 3
num = 50
x = np.arange(num, num - 2*k*m , -1).reshape(-1, 2*k)
x[:, :k+1].ravel()

【讨论】:

  • 我的解决方案最终没有奏效。
  • @JanChristophTerasa 我打算建议如何修复它,但到那时它已经消失了。这是个好主意,值得发布。
  • 我刚刚发布了另一个使用实际有效的掩码的解决方案。不过,它比您的优化解决方案慢了很多,干得好!
  • 非常努力。您受@JanChristopTerasa 解决方案启发的编辑非常优雅和清晰
【解决方案2】:

我们可以使用掩码和np.tile

def mask_and_tile(m=5, k=3, num=50):
    a = np.arange(num, num - 2 * m * k, -1) # create numbers
    mask = np.ones(k * 2, dtype=bool) # create mask
    mask[k+1:] = False # set appropriate elements to False
    mask = np.tile(mask, m) # repeat mask m times
    result = a[mask] # mask our numbers
    return result

或者我们可以使用掩码并切换适当的元素:

def mask(m=5, k=3, num=50):
    a = np.arange(num, num - 2 * m * k, -1) # create numbers
    mask = np.ones_like(a, dtype=bool).reshape(-1, k)
    mask[1::2] = False
    mask[1::2, 0] = True
    result = a[mask.flatten()]
    return result

【讨论】:

    【解决方案3】:

    这样可以正常工作:

    import numpy as np
    m = 5
    k = 3
    num = 50
    h=0
    x = np.array([])
    for i in range(m):
        x = np.append(x, range(num-h,num-h-k-1,-1))
        h+=2*k
    print(x)
    

    输出

    [50. 49. 48. 47. 44. 43. 42. 41. 38. 37. 36. 35. 32. 31. 30. 29. 26. 25.
     24. 23.]
    

    【讨论】:

    • 列表追加优于np.append
    • @hpaulj 我知道是对的,deque() 对于追加、弹出操作比 list 还要好,但是他有问题地提到他想通过 NumPy 来完成它,这就是为什么这种方法。
    【解决方案4】:

    这样做的一种方法是制作一个二维网格并根据其在网格中的位置计算每个数字,然后将其展平为一维数组。

    import numpy as np
    
    num=50
    m=5
    k=3
    
    # coordinates in a grid of width k+1 and height m
    y, x = np.mgrid[:m, :k+1]
    
    # a=[[50-0, 50-1, 50-2, 50-3], [50-0-2*3*1, 50-1-2*3*1, ...], [50-0-2*3*2...]...]
    a = num - x - 2 * k * y
    
    print(a.ravel())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多