使用索引和偏移拆分ndarray - Python

时间:2017-05-23 20:45:16

标签: python arrays numpy

我有两个ndarray个对象ab

我希望拆分 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中环顾四周,但没有找到办法做到这一点。

2 个答案:

答案 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]]