【问题标题】:Efficiently getting values from numpy matrix有效地从 numpy 矩阵中获取值
【发布时间】:2020-03-22 05:31:35
【问题描述】:

我有一个矩阵:a = np.random.randn(10,3),和位置:locs = [[6, 6, 0], [7, 0, 5], [0, 9, 2]]。 我需要用占位符(比如0np.inf)替换loc 第一列描述的位置处a 第一列中的值。同样,aloc 第二列所描述的位置也必须替换为占位符。

我目前已经把它写成循环了:

for i in range(0, locs.shape[1]):
    l = locs[:, i]
    current = a[:, i]
    current[l] = 0
    a[:, i] = current

是否可以用直接的 numpy 操作替换这个循环?

示例输入:

a = 
[[ 1.43734578  0.09736638 -2.25746086]
 [-0.76353825  0.29902121 -0.47547664]
 [-0.6702289  -1.03620696  1.29729398]
 [-0.01606927  0.03169479  0.32413694]
 [-0.87992136 -0.13887237  0.76943651]
 [-0.99176294  1.2174871  -0.04219437]
 [-1.28379798 -2.05605769  0.30146702]
 [-0.7249709   0.12472804  0.43728411]
 [ 0.04843567  0.85251779 -0.12717516]
 [ 0.13927597  2.06447447 -0.74675081]]
locs = 
[[6 6 0]
 [7 0 5]
 [0 9 2]]

预期的输出是:

output = 
array([[ 0.        ,  0.        ,  0.        ],
       [-0.76353825,  0.29902121, -0.47547664],
       [-0.6702289 , -1.03620696,  0.        ],
       [-0.01606927,  0.03169479,  0.32413694],
       [-0.87992136, -0.13887237,  0.76943651],
       [-0.99176294,  1.2174871 ,  0.        ],
       [ 0.        ,  0.        ,  0.30146702],
       [ 0.        ,  0.12472804,  0.43728411],
       [ 0.04843567,  0.85251779, -0.12717516],
       [ 0.13927597,  0.        , -0.74675081]])

【问题讨论】:

    标签: python numpy array-broadcasting


    【解决方案1】:

    花哨的索引应该在这里工作:

    a[loc,np.arange(3)] = placeholder
    

    例子:

    >>> rng = np.random.default_rng()
    >>> a = np.arange(30).reshape(10,3)
    >>> b = rng.integers(0,10,(3,3))
    >>> b
    array([[1, 3, 4],
           [5, 7, 1],
           [1, 7, 9]])
    >>> a[b,np.arange(3)] = 100
    >>> a
    array([[  0,   1,   2],
           [100,   4, 100],
           [  6,   7,   8],
           [  9, 100,  11],
           [ 12,  13, 100],
           [100,  16,  17],
           [ 18,  19,  20],
           [ 21, 100,  23],
           [ 24,  25,  26],
           [ 27,  28, 100]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多