Home > Blockchain >  Replacing certain elements of an array based on a given index
Replacing certain elements of an array based on a given index

Time:11-25

I have three numpy arrays:

Arr1 = [9,7,3,1]       (1 x 4 array)
Arr2 = [[14,6],[13,2]] (2 x 2 array)
Arr3 = [0,2]           (1 x 2 array)

I need to replace the elements in Arr1 with the elements in Arr2 with the corresponding indices given in Arr3, such that the output would be:

Output_Arr = [[14,6],[7],[13,2],[1]]

I've written some code that I think is a good start, but it's not working. No errors or anything, just the Arr1 is not updating as if the criteria is not satisfied:

dim1 = len(Arr1)
dim2 = len(Arr2)
dim3 = len(Arr3)

for i in range(dim1):
    for j in range(dim3):
        if i==Arr3[j]:
            Arr1[i] = Arr2[j]
        else:
            Arr1[i] = Arr1[i]

Does anyone have any ideas of how to go about this?

CodePudding user response:

you can do it with list comprehension, which will save you some code lines and make it more interpretable, though it won't improve the runtime, as it uses loops under the hood. Also note that by incorparating a varying length lists, you'll loose any runtime improvements of the NumPy library, as to do so it is being cast to dtype=object

Arr1 = np.array([9,7,3,1], dtype=object)

Arr2 = np.array([[14,6], [1], [13,2]], dtype=object)

Arr3 = np.array([0,2])

result = np.array([[Arr1[i]] if not np.sum(Arr3 == i) else Arr2[i] for i in np.arange(Arr1.size)], dtype=object)

result
OUTPUT: array([list([14, 6]), list([7]), list([13, 2]), list([1])], dtype=object)

Cheers

CodePudding user response:

Your code produces a list

In [505]: Arr1 = [9,7,3,1]
     ...: Arr2 = [[14,6],[13,2]]
     ...: Arr3 = [0,2]
     ...: 
     ...: 
In [506]: dim1 = len(Arr1)
     ...: dim2 = len(Arr2)
     ...: dim3 = len(Arr3)
     ...: 
     ...: for i in range(dim1):
     ...:     for j in range(dim3):
     ...:         if i==Arr3[j]:
     ...:             Arr1[i] = Arr2[j]
     ...:         else:
     ...:             Arr1[i] = Arr1[i]
     ...: 
In [507]: Arr1
Out[507]: [[14, 6], 7, [13, 2], 1]

You could tweak that by changing to Arr1[i] = [Arr1[i]]

If I change Arr1 and Arr2 to arrays, I do get an error

Arr1=np.array([9,7,3,1])
...
ValueError: setting an array element with a sequence.

Trying to put a np.array([14,6]) into a slot of a numeric array is not allowed.

Changing Arr1 to object dtype, does work:

In [511]: Arr1=np.array(Arr1,object)
...
In [513]: Arr1
Out[513]: array([array([14,  6]), 7, array([13,  2]), 1], dtype=object)

So I'm surprised that you didn't either get an error, or at least some sort of change.

  • Related