3

I have the following code :

x = np.array([[1]])
print x
print np.lib.pad(x,(1,1),mode='constant',constant_values=[4,8])

output :

[[1]]
[[4 4 8]
[4 1 8]
[4 8 8]]

the problem is : in the constant values I want to put the new padding for example :

print np.lib.pad(x,(1,1),mode='constant',constant_values = [1,2,3,4,5,6,7,8])

and output like :

[[1,2,3]
[8,1,4]
[7,6,5]]
Mazdak
  • 105,000
  • 18
  • 159
  • 188
samer226047
  • 125
  • 1
  • 13

2 Answers2

1

This is a reverse engineering of Print two-dimensional array in spiral order:

inner_array = np.array([3, 6, 7, 2])
outer_array = np.array([0, 23, 3, 5, 6, 8, 99, 73, 18, 42, 67, 88, 91, 12])

total_array = inner_array[::-1][np.newaxis]
i = 0
while True:
    s = total_array.shape[1]
    try:
        total_array = np.vstack([total_array, outer_array[i:i+s]])
    except ValueError:
        break
    try:
        total_array = np.rot90(total_array, -1)
    except ValueError:
        pass
    i += s
total_array = np.rot90(total_array, -1)
print(total_array)
Community
  • 1
  • 1
Ophir Carmi
  • 2,701
  • 1
  • 23
  • 42
  • It's not always from 1 to 8, most cases it's binary (0,1) so any combination is possible. I tried your code and it won't maintain the order of the provided array. and the array I want to pad not always 1 element sometimes it's much more than that. – samer226047 Aug 01 '16 at 14:09
  • Thanks the code worked fine. but I managed to do customized code for my case with 10^-5 time compared to 10^-3 with your code. Thanks again. – samer226047 Aug 01 '16 at 15:12
0

The answer is way different since it's pretty customized to my problem ( Field Of View).

def updatevalues(self,array,elementsCount): 
    counter =0
    R1 =Agent.GetCenterCoords(array.shape)[0]
    C1 = array.shape[1]-1
    coords = {'R1':R1,'R2':R1,'C1':C1,'C2':C1,'Phase':1}
    array[coords['R1'],coords['C1']] = True

    while counter<elementsCount:
        counter +=2
        self.Phases[coords['Phase']](array,coords)

def Phase1(self,array,coords):
    '''
    Phase 1.
    During this phase we start from the max column(C1,C2) and middle Row (R1,R2) 
    and start moving up and down till  
    minimum row (R1 ) , max Row (R2) then we move to phase 2
    '''
    coords['R1'] -=1
    coords['R2'] +=1
    array[coords['R1'],coords['C1']] = True
    array[coords['R2'],coords['C2']] = True
    if coords['R1']==0 or coords['R2'] == array.shape[0]-1:
        coords['Phase']=2

def Phase2(self,array,coords):
    '''
    Phase 2.
    During this phase we start from the max column (C1,C2) and Min,Max Rows (R1,R2) 
    and start changing (C1,C2 to minimum) till
    C1,C2 ==0 then we move to phase 3
    '''
    coords['C1'] -=1
    coords['C2'] -=1
    array[coords['R1'],coords['C1']] = True
    array[coords['R2'],coords['C2']] = True
    if coords['C1']==0 or coords['C2'] ==0:
        coords['Phase']=3

def Phase3(self,array,coords):
    '''
    Phase 3.
    During this phase we start from the minimum columns (C1,C2) and Min,Max Rows (R1,R2) 
    and start changing (R1,R2) toward center till R1==R2 then we break (all border got covered)
    '''
    coords['R1'] +=1
    coords['R2'] -=1
    array[coords['R1'],coords['C1']] = True
    array[coords['R2'],coords['C2']] = True
    if coords['R1']==coords['R2']:
        coords['Phase']=4

@staticmethod
def GetCenterCoords(shape):
    return (shape[0]-1)/2 , (shape[1]-1)/2

the solution depends on how many values we want to change on the border starting from the max row, middle column to the right then start moving in two directions simultaneously. Sorry for the complex solution but as I told you @Ophir it's pretty customized solution for my problem. (when I put the question I used a very general forum to simplify it.) hope this help others one day.

samer226047
  • 125
  • 1
  • 13