Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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中数组的索引切片二维数组_Python_Arrays_Numpy_Slice - Fatal编程技术网

使用python中数组的索引切片二维数组

使用python中数组的索引切片二维数组,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,我正在处理2D numpy数组的切片。为了选择切片,我将索引存储在数组中。例如,我有: mat = np.zeros([xdim,ydim], float) xmin = np.array([...]) # Array of minimum indices in x xmax = np.array([...]) # Array of maximum indices in x ymin = np.array([...]) # Array of minimum indices in y ymax =

我正在处理2D numpy数组的切片。为了选择切片,我将索引存储在数组中。例如,我有:

mat = np.zeros([xdim,ydim], float)
xmin = np.array([...]) # Array of minimum indices in x
xmax = np.array([...]) # Array of maximum indices in x
ymin = np.array([...]) # Array of minimum indices in y
ymax = np.array([...]) # Array of maximum indices in y
value = np.array([...]) # Values
其中,
仅表示先前计算的一些整数。所有阵列均定义良好,长度约为265000。我想做的是:

mat[xmin:xmax, ymin:ymax] += value
以这样的方式,对于第一个元素,我将:

mat[xmin[0]:xmax[0], ymin[0]:ymax[0]] += value[0]
mat[xmin[1]:xmax[1], ymin[1]:ymax[1]] += value[1]
以此类推,用于阵列的约265000个元素。不幸的是,我刚才写的东西不起作用,它抛出了一个错误:
索引器:无效切片

我一直在尝试使用这里建议的
np.meshgrid
,但它对我还不起作用。此外,我正在寻找一种pythonic方法来实现这一点,避免for循环

任何帮助都将不胜感激


谢谢

如果不借助Cython之类的工具,我认为没有一种令人满意的方法可以将问题矢量化。让我来概括一下纯numpy解决方案是什么样子的,这应该清楚地说明为什么这可能不是一个很好的方法

首先,让我们看一个1D案例。numpy中的一堆切片没有多少功能,因此第一个任务是将它们扩展到单个索引中。假设您的阵列是:

mat = np.zeros((10,))
x_min = np.array([2, 5, 3, 1])
x_max = np.array([5, 9, 8, 7])
value = np.array([0.2, 0.6, 0.1, 0.9])
然后,以下代码将切片限制扩展为(可能重复的)索引和值列表,将它们与
bincount
连接在一起,并将它们添加到原始
mat

x_len = x_max - x_min
x_cum_len = np.cumsum(x_len)
x_idx = np.arange(x_cum_len[-1])
x_idx[x_len[0]:] -= np.repeat(x_cum_len[:-1], x_len[1:])
x_idx += np.repeat(x_min, x_len)
x_val = np.repeat(value, x_len)
x_cumval = np.bincount(x_idx, weights=x_val)
mat[:len(x_cumval)] += x_cumval

>>> mat
array([ 0. ,  0.9,  1.1,  1.2,  1.2,  1.6,  1.6,  0.7,  0.6,  0. ])
可以将其扩展到您的2D案例中,尽管这并不简单,而且事情开始变得难以理解:

mat = np.zeros((10, 10))
x_min = np.array([2, 5, 3, 1])
x_max = np.array([5, 9, 8, 7])
y_min = np.array([1, 7, 2, 6])
y_max = np.array([6, 8, 6, 9])
value = np.array([0.2, 0.6, 0.1, 0.9])

x_len = x_max - x_min
y_len = y_max - y_min
total_len = x_len * y_len
x_cum_len = np.cumsum(x_len)
x_idx = np.arange(x_cum_len[-1])
x_idx[x_len[0]:] -= np.repeat(x_cum_len[:-1], x_len[1:])
x_idx += np.repeat(x_min, x_len)
x_val = np.repeat(value, x_len)
y_min_ = np.repeat(y_min, x_len)
y_len_ = np.repeat(y_len, x_len)
y_cum_len = np.cumsum(y_len_)
y_idx = np.arange(y_cum_len[-1])
y_idx[y_len_[0]:] -= np.repeat(y_cum_len[:-1], y_len_[1:])
y_idx += np.repeat(y_min_, y_len_)
x_idx_ = np.repeat(x_idx, y_len_)
xy_val = np.repeat(x_val, y_len_)
xy_idx = np.ravel_multi_index((x_idx_, y_idx), dims=mat.shape)
xy_cumval = np.bincount(xy_idx, weights=xy_val)
mat.ravel()[:len(xy_cumval)] += xy_cumval
产生:

>>> mat
array([[ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0.9,  0.9,  0.9,  0. ],
       [ 0. ,  0.2,  0.2,  0.2,  0.2,  0.2,  0.9,  0.9,  0.9,  0. ],
       [ 0. ,  0.2,  0.3,  0.3,  0.3,  0.3,  0.9,  0.9,  0.9,  0. ],
       [ 0. ,  0.2,  0.3,  0.3,  0.3,  0.3,  0.9,  0.9,  0.9,  0. ],
       [ 0. ,  0. ,  0.1,  0.1,  0.1,  0.1,  0.9,  1.5,  0.9,  0. ],
       [ 0. ,  0. ,  0.1,  0.1,  0.1,  0.1,  0.9,  1.5,  0.9,  0. ],
       [ 0. ,  0. ,  0.1,  0.1,  0.1,  0.1,  0. ,  0.6,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0.6,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ]])

但是如果你有265000个任意大小的二维切片,那么索引数组将很快进入数百万个项目。必须处理读写如此多的数据可能会抵消使用numpy带来的速度提升。坦白地说,我怀疑这是一个很好的选择,如果没有其他选择的话,因为你的代码将变得多么神秘。

np.array()
是无效的。对于混淆,我已经添加了一些文本来让它更清楚。你的片段重叠了吗?垫有多大?是的,它们可能重叠。垫子的大小是用户定义的,所以它可以很小也可以很大。你可能想试试Cython或Numba之类的东西,而不是寻找切片技巧。