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

2024-04-19 11:49:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找最快的方式来取代预先分配的numpy ndarray部分。 下面您可以看到sim_matrix(2D-ndarray)。”For循环“逐行遍历它,并覆盖levels给定的值(numpy.数组). 你知道吗

有很多快速的方法可以找到:

  1. numpy.copyto()
  2. numpy.fromiter()
  3. =分配到切片

注意:为了简单起见,我在每次迭代中都分配相同的值,但在生产设置中不是这样的。在实际设置中,levels为每一行包含不同的值。因此,不鼓励使用快捷方式作为numpy.repeatnumpy.hstack作为答案。

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

努比_覆盖.py地址:

import numpy
panel_size = 365 * 7
rows = 1 * (1+1+2*4) * 10000
# rows = 100
levels = [1778.24] * panel_size
levels_array = numpy.fromiter(levels,dtype='single', count = len(levels))
sim_matrix = numpy.empty([rows, panel_size],dtype='single')

def _copyto(sim_matrix_, level_):
    for i in range(sim_matrix_.shape[0]):
        numpy.copyto(sim_matrix[i], level_)


def _fromiter(sim_matrix_, level_):
    len_level = len(level_)
    for i in range(sim_matrix_.shape[0]):
        sim_matrix[i] = numpy.fromiter(level_,
                                      dtype='single', 
                                      count = len_level)

def _just_assign(sim_matrix_, level_):
    for i in range(sim_matrix_.shape[0]):
        sim_matrix[i] = level_

numpy\u覆盖_测试.py你知道吗

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

Tags: importnumpyassetupsimlevelarraymatrix