切片对象可让您以编程方式生成和操作切片。特别是对于多维 numpy 数组,尤其是如果您事先不知道维度,您可能需要即时构造切片以指定所需的轴或维度。
import numpy as np
dimension = np.random.randint(10) # Might have up to 10 dimensions
shape = []
for d in range(dimension):
shape.append(np.random.randint(10))
zz = np.random.rand(tuple(shape))
print(zz)
>>> array([[0.68379351, 0.50854469, 0.64578775, 0.73441699, 0.28977396],
[0.88797164, 0.81603025, 0.63978659, 0.22677299, 0.93455738],
[0.0892855 , 0.28048706, 0.04262895, 0.9353467 , 0.13062249],
[0.88561035, 0.93378367, 0.12124208, 0.25600301, 0.96035638]])
这里我们的数据最终是二维的(4×5),但不能保证这一点。您将如何向zz 请求切片?
一个问题是我无法操作 Python 的切片符号。它不是切片操作之外的有效语法。
my_slice = 2:3:1
>>> SyntaxError: Invalid Syntax
如果我可以在循环中构建我想要的确切切片请求,我可以构建一个字符串怎么办?那不是很好吗?我的意思是,当然你可以使用一个字符串来做,但它会很乱,需要eval。
your_slice_definitions = [(2,3,1), *[(None, None, None)]*(zz.ndim - 1)]
my_slice_str = ""
for slice_start, slice_end, slice_step in your_slice_definitions:
my_slice_str += "{}:{}:{},".format(slice_start, slice_end, slice_step)
eval("zz["+my_slice_str+"])
所以我们在这里:slice 对象让你这样做。您可以即时组装它们的列表和元组,将它们作为函数参数传递,对它们进行排序,随机播放,等等。
my_slices = []
for slice_start, slice_end, slice_step in your_slice_definitions:
my_slices += slice(slice_start, slice_end, slice_step)
print(zz[my_slices])
>>> array([[0.0892855 , 0.28048706, 0.04262895, 0.9353467 , 0.13062249]])