代码之家  ›  专栏  ›  技术社区  ›  Jan

将数据填充到矩阵中,传递其定义的索引遇到索引器的元素

  •  1
  • Jan  · 技术社区  · 8 年前

    numpy

    row = np.array([1,5,8,15,2])
    column = np.array([2,3,4,7,8])
    

    mymatrix的维数为10×10

    mymatrix = np.zeros(shape=(10,10))
    

    (row=15,column=7)

    try:
      mymatrix[row, column] = 100
    except IndexError:
      pass
    

    3 回复  |  直到 8 年前
        1
  •  3
  •   Divakar    8 年前

    使用有效行和列的掩码,并使用它来掩码它们,索引到2D数组中,然后用 integer-array indexing row column 作为数组,我们将有一个这样的解决方案-

    m,n = mymatrix.shape
    mask = (row>=0) & (row < m) & (column>=0) & (column < n)
    mymatrix[row[mask], column[mask]] = 100
    

    样本运行-

    In [19]: row = np.array([1,5,8,15,2])
        ...: column = np.array([2,3,4,7,8])
        ...: 
    
    In [20]: mymatrix = np.zeros(shape=(10,10))
    
    In [21]: m,n = mymatrix.shape
    
    In [22]: mask = (row>=0) & (row < m) & (column>=0) & (column < n)
    
    In [23]: mymatrix[row[mask], column[mask]] = 100
    
    In [24]: (mymatrix==100).sum() # number of elements edited to 100
    Out[24]: 4
    

    一行 0 (row>=0) (column>=0) 部分。

        2
  •  1
  •   glegoux    8 年前

    import numpy as np
    
    m = np.zeros((10, 10))
    rows = np.array([1, 5, 8, 15, 2])
    columns = np.array([2, 3, 4, 7, 8])
    
    n, p = m.shape
    for i, j in zip(rows, columns):
        if 0 <= i < n and 0 <= j < p:
            m[i, j] = 100
    
    print(m)
    

    输出:

    [[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.  100.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.  100.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.  100.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.  100.    0.    0.    0.    0.    0.]
     [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]]
    

    您可以查看是否正确:

    print('rows: {}, \ncolumns: {}'.format(*np.where(m == 100)))
    

    rows: [1 2 5 8], 
    columns: [2 8 3 4]
    

    性能:

    解决方案.py

    import numpy as np
    
    m = np.zeros((10, 10))
    rows = np.array([1, 5, 8, 15, 2])
    cols = np.array([2, 3, 4, 7, 8]) 
    
    # without numpy
    def multiple_insert(m, value, rows, cols):
        n, p = m.shape
        for i, j in zip(rows, cols):
            if 0 <= i < n and 0 <= j < p:
                m[i, j] = value
    
    
    # with numpy
    def multiple_insert2(m, value, rows, cols):
        n, p = m.shape
        mask = (0 <= rows) & (rows < n) & (0 <= cols) & (cols < p)
        m[rows[mask], cols[mask]] = value
    

    ipython 慰问:

    In [1]: run solution.py
    
    In [2]: %timeit multiple_insert(m, 100, rows, cols)
    100000 loops, best of 3: 4.06 µs per loop
    
    In [3]: %timeit multiple_insert2(m, 100, rows, cols)
    100000 loops, best of 3: 7.34 µs per loop
    

    有时使用always NumPy是不好的。

        3
  •  0
  •   Saurabh Shrivastava    8 年前

    mymatrix[row, column] = 100 . row column 数组不是整数。

    您需要迭代行和列数组,并在中传递每个元素 mymatrix