我有两个ndarray
个对象a
和b
。
我希望拆分 b
使用数组a
中提供的索引,但不是采用传统方式(使用{{1} })。
具体来说,我想创建以数组numpy.split
的索引开头的多个子数组,将它们称为b
并以b[i]
结尾,其中X是a我选择的号码。
示例:
b[i] + X
a = [1, 4, 9]
我的b = [30, 45, 10, 20, 5, 32, 104, 39, 23, 450, 2, 102, 50]
功能会导致以下split()
:
X=2
我在numpy中环顾四周,但没有找到办法做到这一点。
答案 0 :(得分:2)
只使用切片,如果使用Python列表而不是NumPy Arrays,它的工作原理相同:
a = np.array([1, 4, 9])
b = np.array([30, 45, 10, 20, 5, 32, 104, 39, 23, 450, 2, 102, 50])
X = 3 # Add one extra here
print(np.array([b[i:i+X] for i in a]))
那将打印:
[[ 45 10 20]
[ 5 32 104]
[450 2 102]]
答案 1 :(得分:1)
以广播方式创建所有这些索引的一种方法,其中范围数组的长度为X
-
b[a[:,None] + range(X+1)]
示例运行 -
In [369]: a = np.array([1, 4, 9])
...: b = np.array([30, 45, 10, 20, 5, 32, 104, 39, 23, 450, 2, 102, 50])
...: X = 2
...:
# All needed indices generated
In [375]: a[:,None] + range(X+1)
Out[375]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 9, 10, 11]])
# Index into b to get those values
In [376]: b[a[:,None] + range(X+1)]
Out[376]:
array([[ 45, 10, 20],
[ 5, 32, 104],
[450, 2, 102]])
它创建那些需要多个子数组作为2D
数组的行。
如果您需要这些作为列表 -
In [372]: b[a[:,None] + range(X+1)].tolist()
Out[372]: [[45, 10, 20], [5, 32, 104], [450, 2, 102]]