Numpy 2D数组索引无界且具有裁剪值

Max*_*nko 5 python arrays numpy multidimensional-array

我有索引数组

a = np.array([
   [0, 0],
   [1, 1],
   [1, 9]
])
Run Code Online (Sandbox Code Playgroud)

和2D阵列

b = np.array([
   [0, 1, 2, 3],
   [5, 6, 7, 8]
])
Run Code Online (Sandbox Code Playgroud)

我可以做到这一点

b[a[:, 0], a[:, 1]]
Run Code Online (Sandbox Code Playgroud)

但这是“ 超出范围 ” 的例外,因为9超出范围。我需要一种非常快速的方法来按索引制作数组切片,如果可以设置裁剪值,这将是理想的选择,例如:

np.indexing_with_clipping(array=b, indices=a, clipping_value=0)
> array([0, 6, --> 0 = clipped value <--])
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 2

这是一个方法 -

def indexing_with_clipping(arr, indices, clipping_value=0):
    idx = np.where(indices < arr.shape,indices,clipping_value)
    return arr[idx[:, 0], idx[:, 1]]
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [266]: arr
Out[266]: 
array([[0, 1, 2, 3],
       [5, 6, 7, 8]])

In [267]: indices
Out[267]: 
array([[0, 0],
       [1, 1],
       [1, 9]])

In [268]: indexing_with_clipping(arr,indices,clipping_value=0)
Out[268]: array([0, 6, 5])

In [269]: indexing_with_clipping(arr,indices,clipping_value=1)
Out[269]: array([0, 6, 6])

In [270]: indexing_with_clipping(arr,indices,clipping_value=2)
Out[270]: array([0, 6, 7])

In [271]: indexing_with_clipping(arr,indices,clipping_value=3)
Out[271]: array([0, 6, 8])
Run Code Online (Sandbox Code Playgroud)

着眼于内存和性能效率,这里有一种修改函数内索引的方法 -

def indexing_with_clipping_v2(arr, indices, clipping_value=0):
    indices[indices >= arr.shape] = clipping_value
    return arr[indices[:, 0], indices[:, 1]]
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [307]: arr
Out[307]: 
array([[0, 1, 2, 3],
       [5, 6, 7, 8]])

In [308]: indices
Out[308]: 
array([[0, 0],
       [1, 1],
       [1, 9]])

In [309]: indexing_with_clipping_v2(arr,indices,clipping_value=2)
Out[309]: array([0, 6, 7])
Run Code Online (Sandbox Code Playgroud)