简体   繁体   中英

Fill numpy array by rows

How can I fill the numpy array by rows?

For example arr=np.zeros([3,2]). I want replace every row by list = [1,2].

So output is:

[1 2 
 1 2
 1 2]

I can make it by hand

for x in arr[:]:
    arr[:]=[1,2]

But I believe there is more faster ways.

Sorry, please look edit: Suppose, we have:

arr=array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

I want arr[1] array fill by [1,2] like this:

arr=array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 1.,  1.,  1.],
        [ 2.,  2.,  2.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

Your loop isn't necessary.

Making use of broadcasting , you can do this with a single assignment:

arr[:] = [1,2]

Numpy broadcasts the right-hand-side array to a shape assignable to the left-hand-side.


As for the second question (in your update), you can do:

arr.T[..., 1] = [1,2]

In this case, simple assignment to the whole array works:

In [952]: arr=np.zeros((3,2),int)
In [953]: arr[...]=[1,2]
In [954]: arr
Out[954]: 
array([[1, 2],
       [1, 2],
       [1, 2]])

That's because the list translates into a (2,) array, which can be broadcasted to (1,2) and then (3,2), to match arr :

In [955]: arr[...]=np.array([3,2])[None,:]
In [956]: arr
Out[956]: 
array([[3, 2],
       [3, 2],
       [3, 2]])

If I want to set values by column, I have to do a bit more work

In [957]: arr[...]=np.array([1,2,3])[:,None]
In [958]: arr
Out[958]: 
array([[1, 1],
       [2, 2],
       [3, 3]])

I have to explicitly make a (3,1) array, which broadcasts to (3,2).

=================

I already answered your modified question:

In [963]: arr[1,...]=np.array([1,2])[:,None]
In [964]: arr
Out[964]: 
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 1.,  1.,  1.],
        [ 2.,  2.,  2.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

=================

Add tile to your toolkit:

In [967]: np.tile([1,2],(3,1))
Out[967]: 
array([[1, 2],
       [1, 2],
       [1, 2]])
In [968]: np.tile([[1],[2]],(1,3))
Out[968]: 
array([[1, 1, 1],
       [2, 2, 2]])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM