0

For editors: this is NOT stripping all strings in an array but stripping the array itself

So suppose i have an array like this:

[[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]]

I want a function stripArray(0, array) where the first argument is the "empty" value. After applying this function i want the returned array to look like this:

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

Values that were marked as empty (in this case 0) were stripped from the right and bottom sides. How would I go about implementing such a function? In the real case where I want to use it in the array instead of numbers there are dictionaries.

2
  • what do you mean "instead of numbers there are dictionaries"? each element of the array is a dictionary? If you look for empty dictionaries why do you pass a value to strip array? Commented Mar 22, 2022 at 15:02
  • @SembeiNorimaki yes, every element is a dictionary, i just want it to be general so i can reuse it later if there is need Commented Mar 22, 2022 at 15:11

4 Answers 4

2

It is better to do this vectorized

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]])
Sign up to request clarification or add additional context in comments.

Comments

0

Here is an answer which doesnt need 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)

Output:

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

Comments

0

Code:

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

Output:

[[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]]

Comments

0

try using np.delete to remove unwanted rows or columns

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)

output:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.