Python Forum

Full Version: Replacing sub array in Numpy array
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I'm trying to replace a sub array in a Numpy array, with an array of the same shape, such that any changes are mirrored in both arrays. I've run the following code in IDLE.

>>> import numpy
>>> a=numpy.zeros((2,1))
>>> a
array([[0.],
       [0.]])
>>> b=numpy.zeros((1))
>>> b
array([0.])
>>> a[0]=b
>>> b[0]=1
>>> b
array([1.])
>>> 
Now what I'd want the output of a to be in this example is:

array([[1.],
       [0.]])
but instead I get:

[b]array([[0.],
       [0.]])[/b]
I've been trying to read up on slicing and indexing, but it's not immediately obvious to me what I'm doing wrong here, or if it's even possible to get the result I want. So I was hoping someone could tell me how, if at all, I can do this.
You cann't do this with default dtype (np.float64). However, numpy arrays are mutable,
so, if you define a-array with dtype= np.object,everything should work fine.
Try the following example:
a = np.array([1,3,4], dtype=np.object)
b = np.array([0])
a[0] = b
print(a)
b[0] = 99
print(a)
(Mar-18-2020, 10:06 AM)scidam Wrote: [ -> ]You cann't do this with default dtype (np.float64). However, numpy arrays are mutable,
so, if you define a-array with dtype= np.object,everything should work fine.
Try the following example:
a = np.array([1,3,4], dtype=np.object)
b = np.array([0])
a[0] = b
print(a)
b[0] = 99
print(a)

But my example code uses multidimensional arrays. If I try that with your code, it doesn't work anymore.
And nevermind my previous post. It took me a while but I finally figured out how it works and actually got some similar code to run. Now it's on to multidimensional arrays.
(Mar-30-2020, 07:24 PM)ThemePark Wrote: [ -> ]Now it's on to multidimensional arrays.
The same rules are true for multidimensional cases.
import numpy as np
x=np.ones((2,2,2), dtype=np.float32)
z =  np.zeros((2,2,2), dtype=np.object)
z[0][0][0] = x
x[0][0][0] = 99
print(z)
(Apr-01-2020, 01:52 AM)scidam Wrote: [ -> ]
(Mar-30-2020, 07:24 PM)ThemePark Wrote: [ -> ]Now it's on to multidimensional arrays.
The same rules are true for multidimensional cases.
import numpy as np
x=np.ones((2,2,2), dtype=np.float32)
z =  np.zeros((2,2,2), dtype=np.object)
z[0][0][0] = x
x[0][0][0] = 99
print(z)

Okay, truthfully I didn't realize you'd go that way. But what I mean by multidimensional arrays is that z[0][0][0] would not contain x, but x[0][0][0] and then the 99 would be shown in both arrays.

You can look at my other post too, it's the same problem I'm trying to solve.