Powiedz, że jest ta tablica:

x=np.arange(10).reshape(5,2)
x=array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

Czy tablica może być pokrojona taka, że dla każdego wiersza, z wyjątkiem pierwszego połączenia wierszy w nową matrycę?

Na przykład:

newMatrixArray[0]=array([[0, 1],
       [2, 3]])

newMatrixArray[1]=array([[0, 1],
       [4, 5]])

newMatrixArray[2]=array([[0, 1],
       [6, 7]])

To byłoby łatwe do zrobienia z pętli, ale czy istnieje piythonic sposób tego robić?

3
Alex 8 wrzesień 2017, 15:16

2 odpowiedzi

Najlepsza odpowiedź

Moglibyśmy utworzyć wszystkie te wskaźniki wierszy, a następnie po prostu indeksować na x.

Tak więc jedno rozwiązanie -

n = x.shape[0]
idx = np.c_[np.zeros((n-1,1),dtype=int), np.arange(1,n)]
out = x[idx]

Przykładowe wejście, wyjście -

In [41]: x
Out[41]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

In [42]: out
Out[42]: 
array([[[0, 1],
        [2, 3]],

       [[0, 1],
        [4, 5]],

       [[0, 1],
        [6, 7]],

       [[0, 1],
        [8, 9]]])

Istnieją różne inne sposoby, aby uzyskać te indeksy idx. Zaproponujmy niewiele dla dobra.

Jeden z broadcasting -

(np.arange(n-1)[:,None] + [0,1])*[0,1]

Jeden z array-initialization -

idx = np.zeros((n-1,2),dtype=int)
idx[:,1] = np.arange(1,n)

Jeden z cumsum -

np.repeat(np.arange(2)[None],n-1,axis=0).cumsum(0)

Jeden z rozszerzeniem listy -

np.c_[[[0]]*(n-1), range(1,n)]

Również dla wydajności, użyj np.column_stack lub np.concatenate zamiast np.c_.

4
Divakar 8 wrzesień 2017, 12:45

Moje podejście byłoby rozumieniem listy:

np.array([
    [x[0], x[i]]
    for i in range(1, len(x))
])
1
Kos 8 wrzesień 2017, 12:20