【问题标题】:Group a numpy array分组一个numpy数组
【发布时间】:2021-03-20 21:57:58
【问题描述】:

我有一个一维数组A,这样0 <= A[i] <= 11,我想将A映射到一个数组B,这样

for i in range(len(A)):
    if 0 <= A[i] <= 2: B[i] = 0
    elif 3 <= A[i] <= 5: B[i] = 1
    elif 6 <= A[i] <= 8: B[i] = 2
    elif 9 <= A[i] <= 11: B[i] = 3

如何在numpy 中有效地实现这一点?

【问题讨论】:

  • 两个数组都是一维的,代码在for循环中?
  • @azro 感谢您的指出。我已经编辑了问题。

标签: python arrays numpy matrix


【解决方案1】:

您需要使用//3 的整数除法,这是最高效的解决方案

A = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
B = A // 3

print(A)  # [0  1  2  3  4  5  6  7  8  9 10 11]
print(B)  # [0  0  0  1  1  1  2  2  2  3  3  3]

【讨论】:

    【解决方案2】:

    我会做一些事情,比如将 A[i] 的值除以 3,因为您将它们 3 除以 3、0-2 除以 3 去回答 0、3-5 去回答 1、6- 8 除以 3 等于 2,以此类推

    我在这里建立了一个小架构:

    A[i] --&gt; 0-2. 除以 3 = 0,你在数组 B[i] 中得到的是 0,所以没关系 A[i] --&gt; 3-5. 除以 3 = 1,以此类推。只需使用一种方法将 floor 设为值,使其不会变为 float 类型。

    【讨论】:

    • 好主意' np.array([2,5,6,7,8,11])//3 => array([0, 1, 2, 2, 2, 3])
    【解决方案3】:

    其他人提供的答案是有效的,但是我发现 numpy 的这个函数非常优雅,而且它可以让你避免 for 循环,这对于大型数组来说可能是非常低效的

    import numpy as np
    
    bins = [3, 5, 8, 9, 11]
    B = np.digitize(A, bins)
    

    【讨论】:

    • 不错,但比 //3 慢 10 倍左右
    • 我认为这个功能在数字不等于 3 的情况下非常有用。
    • 对@azro,但它是一个通用解决方案。如果单个间隔不遵守长度 3 规则,则其他解决方案将无法“可扩展”
    【解决方案4】:

    这样的事情可能会奏效:

    C = np.zeros(12, dtype=np.int)
    C[3:6] = 1
    C[6:9] = 2
    C[9:12] = 3
    
    B = C[A]
    

    【讨论】:

      【解决方案5】:

      如果您希望将此扩展为更复杂的示例,您可以定义一个包含所有条件的函数:

      def f(a):
          if 0 <= a and a <= 2:
              return 0
          elif 3 <= a and a <= 5:
              return 1
          elif 6 <= a and a <= 8:
              return 2
          elif 9 <= a and a <= 11:
              return 3
      

      然后在你的数组上调用它A:

      A = np.array([0,1,5,7,8,9,10,10, 11])
      B = np.array(list(map(f, A))) # array([0, 0, 1, 2, 2, 3, 3, 3, 3])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 2011-07-27
        • 2022-06-14
        • 2018-08-02
        • 2017-04-03
        • 2012-04-04
        相关资源
        最近更新 更多