用另一个数组切片多维数组
Slicing multi-dimensional array with another array
编辑了一个更清晰的示例,并包含了解决方案
我想对任意维数组进行切片,我在其中固定第一个 n
维度并保留其余维度。此外,我希望能够将 n
固定尺寸存储在变量中。例如
Q = np.arange(24).reshape(2, 3, 4) # array to be sliced
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
Q[0, 1, ...] # this is what I want manually
# array([4, 5, 6, 7])
# but programmatically:
s = np.array([0, 1])
Q[s, ...] # this doesn't do what I want: it uses both s[0] and s[1] along the 0th dimension of Q
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
np.take(Q, s) # this unravels the indices and takes the s[i]th elements of Q
# array([0, 1])
Q[tuple(s)] # this works! Thank you kwin
# array([4, 5, 6, 7])
有干净的方法吗?
你可以这样做:
Q[tuple(s)]
或者这样:
np.take(Q, s)
这两个都产生 array([0.58383736, 0.80486868])
。
对于 s
的元组版本与使用 s
本身进行索引的确切原因,我恐怕没有很好的直觉。我凭直觉尝试的另一件事是 Q[*s]
但这是一个语法错误。
我不确定你想要什么输出,但你可以做几件事。
如果你想要这样的输出:
array([[[0.46988733, 0.19062458],
[0.69307707, 0.80242129],
[0.36212295, 0.2927196 ],
[0.34043998, 0.87408959],
[0.5096636 , 0.37797475]],
[[0.98322049, 0.00572271],
[0.06374176, 0.98195354],
[0.63195656, 0.44767722],
[0.61140211, 0.58889763],
[0.18344186, 0.9587247 ]]])
Q[list(s)]
应该可以。 np.array([Q[i] for i in s])
也有效。
如果你想要这样的输出:
array([0.58383736, 0.80486868])
然后正如@kwinkunks 提到的那样,您可以使用 Q[tuple(s)]
或 np.take(Q, s)
编辑了一个更清晰的示例,并包含了解决方案
我想对任意维数组进行切片,我在其中固定第一个 n
维度并保留其余维度。此外,我希望能够将 n
固定尺寸存储在变量中。例如
Q = np.arange(24).reshape(2, 3, 4) # array to be sliced
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
Q[0, 1, ...] # this is what I want manually
# array([4, 5, 6, 7])
# but programmatically:
s = np.array([0, 1])
Q[s, ...] # this doesn't do what I want: it uses both s[0] and s[1] along the 0th dimension of Q
# array([[[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]],
# [[12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]]])
np.take(Q, s) # this unravels the indices and takes the s[i]th elements of Q
# array([0, 1])
Q[tuple(s)] # this works! Thank you kwin
# array([4, 5, 6, 7])
有干净的方法吗?
你可以这样做:
Q[tuple(s)]
或者这样:
np.take(Q, s)
这两个都产生 array([0.58383736, 0.80486868])
。
对于 s
的元组版本与使用 s
本身进行索引的确切原因,我恐怕没有很好的直觉。我凭直觉尝试的另一件事是 Q[*s]
但这是一个语法错误。
我不确定你想要什么输出,但你可以做几件事。
如果你想要这样的输出:
array([[[0.46988733, 0.19062458],
[0.69307707, 0.80242129],
[0.36212295, 0.2927196 ],
[0.34043998, 0.87408959],
[0.5096636 , 0.37797475]],
[[0.98322049, 0.00572271],
[0.06374176, 0.98195354],
[0.63195656, 0.44767722],
[0.61140211, 0.58889763],
[0.18344186, 0.9587247 ]]])
Q[list(s)]
应该可以。 np.array([Q[i] for i in s])
也有效。
如果你想要这样的输出:
array([0.58383736, 0.80486868])
然后正如@kwinkunks 提到的那样,您可以使用 Q[tuple(s)]
或 np.take(Q, s)