我有一些代码,我反复需要以复杂的方式重复广播数组,例如:
a = b[np.newaxis, ..., :, np.newaxis] * c[..., np.newaxis, np.newaxis, :]
我可以存储这些切片规格的对象吗?
即。 (但显然这不起作用):
s1 = magic([np.newaxis, ..., :, np.newaxis])
s2 = magic([..., np.newaxis, np.newaxis, :])
编辑:也许这可以通过numpy.broadcast_to
来完成,但是目前还不清楚确保正确的轴在广播时的准确程度......
答案 0 :(得分:5)
您可以手动构建索引元组,但NumPy包含helper:
slice_tuple = np.s_[np.newaxis, ..., :, np.newaxis]
然后b[np.newaxis, ..., :, np.newaxis]
相当于b[slicetuple]
。
作为参考,手动构建元组将是(np.newaxis, Ellipsis, slice(None), np.newaxis)
。此外,np.newaxis is None
,因此(None, Ellipsis, slice(None), None)
也是等效的。
np.s_
可以按照以下方式重新实现:
class IndexHelper(object):
def __getitem__(self, arg):
return arg
s_ = IndexHelper()