【发布时间】:2017-12-02 06:25:01
【问题描述】:
假设我有 3(或更多)维数组 A 和两个具有最小和最大边的数组 left、right 用于切片。
还有比这更简洁的表示法来选择由我的边缘分隔的视图吗?
V = A[left[0]:right[0], left[1]:right[1], left[2]:right[2])
可能这样的东西已经更好了
view = [ slice(a, b) for a,b in zip(left, right) ]
V = A[view]
但我觉得我没有看到更多的 numpythonic 方式......不知道,np.s_ 的东西?
编辑:预期结果的示例
A = np.arange(1000).reshape(10,10,10)
left = np.array([0, 0, 0])
right = np.array([2, 4, 3])
view = [ slice(a, b) for a,b in zip(left, right) ]
In [32]: A[view]
Out[32]:
array([[[ 0, 1, 2],
[ 10, 11, 12],
[ 20, 21, 22],
[ 30, 31, 32]],
[[100, 101, 102],
[110, 111, 112],
[120, 121, 122],
[130, 131, 132]]])
【问题讨论】:
-
您有示例数组和预期输出吗?
-
当然,查看编辑
-
np.s_只允许您从第一个表达式np.s_[left[0]:right[0], ...]生成切片元组。您需要以一种或其他方式生成切片元组。 numpythonic 方式 只是一个 Python 编码任务。如果你想让它更漂亮,请将它包装在一个函数(或类)中。 -
可能你是对的,它已经很像这样了......在编写 python/numpy 代码时,我总是觉得我比我应该/可能更冗长,而且我有一些符号技巧缺少让事情变得优雅
-
A[...]是A.__getitem__(atuple)的简写。atuple有三个slice对象。每个slice有3 个属性。