Как разбить 2d-массив в python?

Для редакторов: это НЕ удаление всех строк в массиве, а удаление самого массива.

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

[[0, 1, 8, 4, 0, 0],
 [1, 2, 3, 0, 0, 0], 
 [3, 2, 3, 0, 5, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]

Мне нужна функция stripArray(0, array), где первым аргументом является «пустое» значение. После применения этой функции я хочу, чтобы возвращаемый массив выглядел так:

[[0, 1, 8, 4, 0],
 [1, 2, 3, 0, 0], 
 [3, 2, 3, 0, 5]]

Значения, помеченные как пустые (в данном случае 0), были удалены из правая и нижняя стороны. Как мне реализовать такую ​​функцию? В реальном случае, когда я хочу использовать его в массиве вместо чисел, есть словари.

что значит "вместо цифр словари"? каждый элемент массива является словарем? Если вы ищете пустые словари, почему вы передаете значение в массив полос?

Sembei Norimaki 22.03.2022 16:02

@SembeiNorimaki да, каждый элемент - это словарь, я просто хочу, чтобы он был общим, чтобы я мог повторно использовать его позже, если возникнет необходимость

dacoconutchemist 22.03.2022 16:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
52
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Лучше делать это в векторе

import numpy as np
arr = np.array([[0, 1, 8, 4, 0, 0],
                [1, 2, 3, 0, 0, 0], 
                [3, 2, 3, 0, 5, 0],
                [0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0]])
def stripArray(e, arr):
    return arr[(arr!=e).any(axis = 1), :][:, (arr!=e).any(axis = 0)]
stripArray(0, arr)
array([[0, 1, 8, 4, 0],
       [1, 2, 3, 0, 0],
       [3, 2, 3, 0, 5]])

Вот ответ, который не нуждается в numpy:

from typing import List, Any

def all_value(value: Any, arr: List[float]) -> bool:
    return all(map(lambda x: x==value, arr))

def transpose_array(arr: List[List[float]]) -> List[List[float]]:
    return list(map(list, zip(*arr)))


def strip_array(value: Any, arr: List[List[float]]) -> List[List[float]]:
    # delete empty rows
    arr = [row for row in arr if not all_value(value, row)]

    #transpose and delete empty columns
    arr = transpose_array(arr)
    arr = [col for col in arr if not all_value(value, col)]

    #transpose back
    arr = transpose_array(arr)
    return arr

test = [[0, 1, 8, 4, 0, 0],
 [1, 2, 3, 0, 0, 0],
 [3, 2, 3, 0, 5, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]

result = strip_array(0, test)

Выход:

result
[[0, 1, 8, 4, 0],
 [1, 2, 3, 0, 0],
 [3, 2, 3, 0, 5]]

Код:

def strip_array(array, empty_val=0):
    num_bad_columns = 0
    while np.all(array[:, -(num_bad_columns+1)] == 0):
        num_bad_columns += 1
    array = array[:, :(-num_bad_columns)]
    num_bad_rows = 0
    while np.all(array[-(num_bad_rows+1), :] == 0):
        num_bad_rows += 1
    array = array[:(-num_bad_rows), :]
    return array


array = np.array(
    [[0, 1, 8, 4, 0, 0],
    [1, 2, 3, 0, 0, 0],
    [3, 2, 3, 0, 5, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0]]
)

print(array)
print(strip_array(array, 0))

Выход:

[[0 1 8 4 0 0]
 [1 2 3 0 0 0]
 [3 2 3 0 5 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]]
[[0 1 8 4 0]
 [1 2 3 0 0]
 [3 2 3 0 5]]

попробуйте использовать np.delete для удаления ненужных строк или столбцов

data=[[0, 1, 8, 4, 0, 0],
 [1, 2, 3, 0, 0, 0], 
 [3, 2, 3, 0, 5, 0],
 [0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0]]

def drop_row(data):
    lstIdx=[]
    for i in range(len(data)):
        count=0
        for j in range(len(data[i])):
            if data[i][j] == 0:
                count+=1
        if count==len(data[i]):
            print("row zero")
            lstIdx.append(i)
    
    #for i in lstIdx:
    data=np.delete(data,lstIdx,axis=0)
    return data

def drop_column(data):
    lstIdx=[]
    if len(data)==0:
        return data
    for j in range(len(data[0])):
        count=0
        for i in range(len(data)):
            if data[i][j] == 0:
                count+=1
        if count==len(data):
            print("column zero")
            lstIdx.append(j)
    data=np.delete(data,lstIdx,axis=1)               
    return data

data=drop_row(data)
data=drop_column(data)

print(data)

выход:

[[0 1 8 4 0]
 [1 2 3 0 0]
 [3 2 3 0 5]]

Другие вопросы по теме