#python #numpy #numpy-slicing
#python #numpy #numpy-нарезка
Вопрос:
Единственным пользовательским вводом является сам массив, первый элемент фрагмента и последний элемент фрагмента?
Т.е.
x=np.array([[1,2,3,4],[5,6,7,8]])
def slicing_array(array, first_element, last_element):
Ввод:
slicing_array(x, 2, 8)
Вывод:
[2,3,4,6,7,8]
Комментарии:
1. Некоторые примеры входных данных и ожидаемые выходные данные были бы полезны.
2. вы могли бы просто использовать объекты среза?
3. что можно ожидать в качестве вывода функции? Ваша проблема связана с доступом к 2D-массиву?
4. Возвращаемым значением должен быть фрагмент (выбранный пользователем) двумерного массива (также выбранный пользователем).
5. неясно. пожалуйста, напишите пример
Ответ №1:
Как насчет этого?
import numpy as np
a = np.array([[3, 5, 2], [3, 2, 4]])
x = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
def slicing_array(array, first_element, last_element):
c = len(array[0])
l = []
for n in range(first_element, last_element 1):
l.append(array[(n-1) // c][(n-1) % c])
return l
print(slicing_array(a, 2, 4))
print(slicing_array(x, 2, 8))
Результат выглядит следующим образом:
[5, 2, 3]
[2, 3, 4, 5, 6, 7, 8]
Комментарии:
1. следует упомянуть, что перебор массива с использованием базового синтаксиса python вместо использования скомпилированных функций numpy приведет к потере производительности.
Ответ №2:
Самое простое решение — использовать операции индексации для сплющенного массива
a = np.asarray([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
def slicing_array(array, first_element, last_element):
return array.flatten()[first_element:last_element]
slicing_array(a,2,7)
> array([3, 4, 5, 6, 7])
numpy имеет довольно обширную документацию о том, как вы можете индексировать массивы:
индексирование numpy
Комментарии:
1. Но будет ли это работать и для 2-мерных массивов?
2. пропустил 2d-часть раньше. сведение массива к одной оси решит проблему
3. приветствую вас. не могли бы вы отметить свой вопрос как ответ?
Ответ №3:
Вы можете использовать np.where для поиска координат заданных первого и последнего элементов, используя их для поиска фрагмента, подобного:
def slicing_2d_array(arr, first_element, last_element):
first_coords = np.where(arr == first_element)
last_coords = np.where(arr == last_element)
first_x, first_y = first_coords[0][0], first_coords[1][0]
last_x, last_y = last_coords[0][0], last_coords[1][0]
res = np.vstack(arr[first_x][first_y:last_y 1], arr[first_x 1][first_y:last_y 1])
for i in range(first_x 1,last_x 1):
np.vstack([res, arr[i][first_y:last_y 1]])
return res
Комментарии:
1. Спасибо, фуркан, очень любезно с вашей стороны!
2. Я удалил понимание списка, потому что он добавляет дополнительный последний элемент. Я разработал ее так, чтобы она также возвращала 2d (потому что я просто вижу ваш ожидаемый результат).
Ответ №4:
a = np.asarray([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) def slicing_array(array, first_element, last_element): возвращает array.flatten()[first_element:last_element]
slicing_array(a,2,7)
массив([3, 4, 5, 6, 7])