【问题标题】:New multidimensional array assigning values from array to indices of second array新的多维数组将数组中的值分配给第二个数组的索引
【发布时间】:2019-10-04 17:08:14
【问题描述】:

虽然我不觉得这过于复杂,但我正在努力寻找类似的问题/答案。

我有两个数组。

indices_array:[0, 1, 1, 0, 0, 1, 0]

值数组:[1, 2, 3, 4, 5, 6, 7]

我想使用第一个数组作为赋值索引和第二个数组作为值来创建一个新数组。这应该会产生一个新数组,每个索引有两个值,但是,一个值为零,另一个是我的第二个数组中的值。

使用我上面的示例数组,结果应该是:

[[1, 0],
 [0, 2],
 [0, 3],
 [4, 0],
 [5, 0],
 [0, 6],
 [7, 0]]

我可以使用以下命令轻松创建所需数组的空版本:np.zeros((total_len, values_per_index))

我的直觉在尝试类似以下内容时失败:target_array[indices_array] = value_array

我相信我理解为什么我尝试的方法会失败,但是如何真正实现这一点却让我难以理解。有没有一种简单的方法可以做到这一点?到目前为止,Python 并不是我最好的语言,而且一些 numpy 技巧有时在本质上似乎过于神奇了..

编辑:我知道 for 循环可以实现这一点,但我真的希望更好地理解 numpy,并在可能的情况下尽可能避免迭代,以实现代码的简洁性和可读性。

【问题讨论】:

    标签: python arrays numpy multidimensional-array


    【解决方案1】:

    你可以这样做:

    import numpy as np
    
    indices = np.array([0, 1, 1, 0, 0, 1, 0])
    values = np.array([1, 2, 3, 4, 5, 6, 7])
    
    result = np.zeros((len(indices), 2))
    
    result[np.arange(len(indices)), indices] = values
    
    print(result)
    

    输出

    [[1. 0.]
     [0. 2.]
     [0. 3.]
     [4. 0.]
     [5. 0.]
     [0. 6.]
     [7. 0.]]
    

    在 numpy 中查看 indexing

    【讨论】:

    • 请注意我的新手,这在我看来是最明显、最直接和最灵活的实现。将索引更改为 0-3 并将元组中的第二个形状值提高为零很容易,对吗?
    • 是的,我相信是的。
    【解决方案2】:

    你可以像下面这样使用乘法

    indices_array = np.array([0, 1, 1, 0, 0, 1, 0])
    value_array = np.array([1, 2, 3, 4, 5, 6, 7])
    
    
    ## you can simply do this
    value_array = np.c_[value_array * (indices_array==0), value_array * (indices_array==1)]
    display(value_array)
    

    【讨论】:

    • np.c_ 上投票。我经常使用np.column_stacknp.r_,但从来不知道np.c_ :) +1
    【解决方案3】:

    这对你有用吗?

    import numpy as np                                                                                                                                                                     
    
    a = np.array([0, 1, 1, 0, 0, 1, 0])                                                                                                                                                    
    b = np.array([1, 2, 3, 4, 5, 6, 7])                                                                                                                                                    
    
    print(np.array([a*b,(1-a)*b]))
    

    [[0 2 3 0 0 6 0]

    [1 0 0 4 5 0 7]]

    【讨论】:

      【解决方案4】:

      您可以简单地使用 column_stack 并使用 numpy 广播进行乘法

      i_arr = np.array([0, 1, 1, 0, 0, 1, 0])
      v_arr = np.array([1, 2, 3, 4, 5, 6, 7])
      
      np.column_stack((1-i_arr, i_arr)) * v_arr[:,None]
      
      Out[61]:
      array([[1, 0],
             [0, 2],
             [0, 3],
             [4, 0],
             [5, 0],
             [0, 6],
             [7, 0]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 2023-03-06
        相关资源
        最近更新 更多