Как мне создать функцию для нарезки 2d-массивов в python?

#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])