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)
这是一个方法 -
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)