Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于上一个索引在每个索引处更新numpy_Python_Numpy - Fatal编程技术网

Python 基于上一个索引在每个索引处更新numpy

Python 基于上一个索引在每个索引处更新numpy,python,numpy,Python,Numpy,是否有一种矢量化的方法,可以根据numpy数组中每个任意索引之前的索引来更新它?例如,在伪代码中,如果我有矩阵 1 2 3 3 1 4 1 3 2 对于每个索引(i,j),我想做: m[i,j] += max(m[i, j-1], m[i-1, j]) 现在我知道我可以迭代地做这件事,但我想知道是否有一种矢量化的方法来做这件事,因为它比一次又一次地从numpy数据空间中取出它更有效 另外,我知道这是一个围栏张贴问题,因为m[0,0]没有前面的元素。通过在矩阵前面加上一行和一列0,可以很容易地

是否有一种矢量化的方法,可以根据numpy数组中每个任意索引之前的索引来更新它?例如,在伪代码中,如果我有矩阵

1 2 3
3 1 4
1 3 2
对于每个索引(i,j),我想做:

m[i,j] += max(m[i, j-1], m[i-1, j])
现在我知道我可以迭代地做这件事,但我想知道是否有一种矢量化的方法来做这件事,因为它比一次又一次地从numpy数据空间中取出它更有效


另外,我知道这是一个围栏张贴问题,因为m[0,0]没有前面的元素。通过在矩阵前面加上一行和一列0,可以很容易地解决这个问题。

以下是一种将其矢量化的方法:

arr = np.array([[1, 2, 3],[3, 1, 4],[1, 3, 2]])

arr_A = np.roll(arr, 1, axis=0)
arr_B = np.roll(arr, 1, axis=1)

max_val = np.maximum(arr_A, arr_B)

output = arr + max_val
>>> [[4 5 5]
     [7 4 7]
     [4 4 6]]
请注意,这对上面的代码给出了不同的答案,因为您编写代码的方式意味着每次循环后值都会更新。如果需要,则必须使用
for
循环

>>> [[ 4  6  9] # Output after updating the matrix in each loop.
     [ 7  8 13]
     [ 8 11 15]]

如果您正在寻找一种类似的算法,而不是试图恢复这个精确的输出,那么
np.roll()
应该可以加快速度。

以下是一种将其矢量化的方法:

arr = np.array([[1, 2, 3],[3, 1, 4],[1, 3, 2]])

arr_A = np.roll(arr, 1, axis=0)
arr_B = np.roll(arr, 1, axis=1)

max_val = np.maximum(arr_A, arr_B)

output = arr + max_val
>>> [[4 5 5]
     [7 4 7]
     [4 4 6]]
请注意,这对上面的代码给出了不同的答案,因为您编写代码的方式意味着每次循环后值都会更新。如果需要,则必须使用
for
循环

>>> [[ 4  6  9] # Output after updating the matrix in each loop.
     [ 7  8 13]
     [ 8 11 15]]
如果您正在寻找一种类似的算法,而不是试图恢复这个精确的输出,那么
np.roll()
应该可以加快速度。

您可以使用创建矩阵的移位版本:

m += np.maximum(np.roll(m, 1, axis=0), np.roll(m, 1, axis=1))
这将创建两个新副本。需要零填充,因为roll会重新引入“滚动”超出边界的元素:

p = np.pad(m, [(1, 1), (1, 1)], 'constant')
m += np.maximum(np.roll(p, 1, axis=0), np.roll(p, 1, axis=1))[1:-1, 1:-1]
您可以使用创建矩阵的移位版本:

m += np.maximum(np.roll(m, 1, axis=0), np.roll(m, 1, axis=1))
这将创建两个新副本。需要零填充,因为roll会重新引入“滚动”超出边界的元素:

p = np.pad(m, [(1, 1), (1, 1)], 'constant')
m += np.maximum(np.roll(p, 1, axis=0), np.roll(p, 1, axis=1))[1:-1, 1:-1]

考虑使用<代码> NUBA<代码>考虑使用<代码> NUBA