Python ndarray的快速突变(替换部分numpy ndarray)

Python ndarray的快速突变(替换部分numpy ndarray),python,numpy,Python,Numpy,我正在寻找最快的方式来替换预先分配的numpy ndarray的部件。 下面您可以看到模拟矩阵(2D阵列)。“For loop”按行对其进行迭代,并覆盖由级别(numpy.array)给出的值 有一些快速的方法可以找到: numpy.copyto() numpy.fromiter() =分配到切片 注意:为了简单起见,我在每次迭代中分配相同的值,但在生产设置中并非如此。在实际设置中,级别为每行包含不同的值。因此,不建议使用快捷方式numpy.repeat或numpy.hstack作为答案 有没有

我正在寻找最快的方式来替换预先分配的numpy ndarray的部件。 下面您可以看到模拟矩阵(2D阵列)。“For loop”按行对其进行迭代,并覆盖由
级别
(numpy.array)给出的值

有一些快速的方法可以找到:

  • numpy.copyto()
  • numpy.fromiter()
  • =
    分配到切片
  • 注意:为了简单起见,我在每次迭代中分配相同的值,但在生产设置中并非如此。在实际设置中,
    级别
    为每行包含不同的值。因此,不建议使用快捷方式
    numpy.repeat
    numpy.hstack
    作为答案

    有没有更快的方法来更改ndarray的某些部分?

    numpy_overwrite.py:
    numpy\u overwrite\u test.py
    运行测试
    有没有可能你只是在找这个

    sim_matrix[:] = levels
    
    编辑:要修改单行,应使用
    sim\u矩阵[row\u id]=levels


    另一方面,要注意。

    我认为
    pass
    关键字没有用here@nicoco我用它们来直观地表示块的末尾,并将其删除。我认为如果您使用一个实际具有不同值的
    级别,则会更好。可能是随机分布的?@Graipher那么在每次迭代中都会有伪数生成器的开销。不是在函数调用中,而是在准备测试数据时。就目前的情况而言,我不明白@nicoco的建议为什么会错。您可以在每次调用时将不同的级别传递给函数。不,每个调用的
    级别
    的值将不同。这些
    级别
    从何而来?列表?如果你想更改一行,只需使用
    sim_matrix[row]=levels
    @CronMerdek我正试图找出你真正的用例是什么样子。因为根据这一点,可能会有更快的选项(例如,如果您拥有所有级别,则一次覆盖多行)。@Graipher我添加了调用赋值的示例
    import timeit
    import numpy_overwrite as npo
    print('_fromiter')
    print(timeit.timeit('npo._fromiter(npo.sim_matrix, npo.levels)', setup="import numpy_overwrite as npo;", number=3))
    print(timeit.timeit('npo._fromiter(npo.sim_matrix, npo.levels_array)', setup="import numpy_overwrite as npo;", number=3))
    print('_copyto')
    print(timeit.timeit('npo._copyto(npo.sim_matrix, npo.levels)', setup="import numpy_overwrite as npo;", number=3))
    print(timeit.timeit('npo._copyto(npo.sim_matrix, npo.levels_array)', setup="import numpy_overwrite as npo;", number=3))
    print('_just_assign')
    print(timeit.timeit('npo._just_assign(npo.sim_matrix, npo.levels)', setup="import numpy_overwrite as npo;", number=3))
    print(timeit.timeit('npo._just_assign(npo.sim_matrix, npo.levels_array)', setup="import numpy_overwrite as npo;", number=3))
    
    _fromiter
    =========
    from python list: 21.129429172957316
    from numpy.array: 61.76275303697912
    
    _copyto
    =========
    from python list: 52.4522930260282
    from numpy.array: 0.7605530479922891
    
    _just_assign
    =========
    from python list: 52.251478374004364
    from numpy.array: 0.6351132979616523
        
    
    sim_matrix[:] = levels