Получить некоторые элементы из массива numpy в обратном порядке - PullRequest
1 голос
/ 18 июня 2019

Мне нужно создать массив массивов, получая элементы в обратном порядке из другого массива.

Пример кода игрушки

Допустим, я использую следующий пример кода игрушки:

import numpy as np
a = np.array([1,2,3,5,8,13])
n = len(a)

for i in range(n):
    print a[n:n-i-2:-1]

Я ожидаю, что последний отпечаток будет [13 8 5 3 2 1], однако я получу пустой массив [], как показано ниже:

>>> 
[13]
[13  8]
[13  8  5]
[13  8  5  3]
[13  8  5  3  2]
[]

Fix

Поэтому мне пришлось создать приведенное ниже исправление для моего кода в цикле for, чтобы получить то, что я ожидаю.

for i in range(n):
    print a[n-i-1:n+1][::-1]

Что означает выбор массивов из исходного массива, а затем его обращение.

Вопросы

  1. Почему, когда я пытаюсь a[6:0:-1], я получаю [13, 8, 5, 3, 2], но как только я пытаюсь a[6:-1:-1], я получаю массив emtpy []? Я ожидаю получить весь массив в обратном порядке, как при попытке a[::-1].
  2. Это исправление, которое я реализовал, или есть что-то, чего мне здесь не хватает?

Редактировать

Пост Понимание обозначения слайса отвечает на мой первый вопрос, но не на второй.

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Вот немного более элегантное исправление.

for i in range(n):
    print a[n:-i-2:-1]

или даже более элегантно

for i in range(n):
    print a[:-i-2:-1]

оба отпечатка

[13]
[13  8]
[13  8  5]
[13  8  5  3]
[13  8  5  3  2]
[13  8  5  3  2  1]

Это также демонстрирует правило, чтоотрицательные индексы отсчитываются сверху, поэтому ваш первоначальный цикл переключает поведение, когда индекс остановки достигает -1.

1 голос
/ 18 июня 2019

Используйте список понимания и получите результаты в одну строку:

import numpy as np

a = np.array([1,2,3,5,8,13])
n = len(a)

# use list comprehension here
[list(a[n:-i-2:-1]) for i in range(n)]
# [[13],
#  [13, 8],
#  [13, 8, 5],
#  [13, 8, 5, 3],
#  [13, 8, 5, 3, 2],
#  [13, 8, 5, 3, 2, 1]]

Если вам действительно нужен исключительный цикл for, используйте это:

for i in range(n):
    print(a[n:-i-2:-1])
1 голос
/ 18 июня 2019

Другой вариант - использовать следующий код:

import numpy as np
a = np.array([1,2,3,5,8,13])
n = len(a)

l = range(n)
l[n-1] = None

for i in range(n):
    print a[n:l[n-i-2]:-1]

По производительности a[n:None:-1] совпадает с a[::-1]

...