srdg
srdg

Reputation: 595

Multiply same numpy array with scalars multiple times

I have a 3D NumPy array of size (9,9,200) and a 2D array of size (200,200). I want to take each channel of shape (9,9,1) and generate an array (9,9,200), every channel multiplied 200 times by 1 scalar in a single row, and average it such that the resultant array is (9,9,1).
Basically, if there are n channels in an input array, I want each channel multiplied n times and averaged - and this should happen for all channels. Is there an efficient way to do so?

So far what I have is this -

import numpy as np
arr = np.random.rand(9,9,200)
nchannel = arr.shape[-1]
transform = np.array([np.random.uniform(low=0.0, high=1.0, size=(nchannel,)) for i in range(nchannel)])
  for channel in range(nchannel):
    # The below line needs optimization
    temp = [arr[:,:,i] * transform[channel][i] for i in range(nchannel)]
    arr[:,:,channel] = np.sum(temp, axis=0)/nchannel

Edit : A sample image demonstrating what I am looking for. Here nchannel = 3. enter image description here The input image is arr. The final image is the transformed arr.

Upvotes: 2

Views: 577

Answers (2)

JuR
JuR

Reputation: 123

EDIT:

import numpy as np

n_channels = 3
scalar_size = 2

t = np.ones((n_channels,scalar_size,scalar_size)) # scalar array
m = np.random.random((n_channels,n_channels)) # letters array

print(m)
print(t)
m_av = np.mean(m, axis=1)
print(m_av)

for i in range(n_channels):
    t[i] = t[i]*m_av1[i]

print(t)

output:

[[0.04601533 0.05851365 0.03893352]
 [0.7954655  0.08505869 0.83033369]
 [0.59557455 0.09632997 0.63723506]]

[[[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]]

[0.04782083 0.57028596 0.44304653]

[[[0.04782083 0.04782083]
  [0.04782083 0.04782083]]

 [[0.57028596 0.57028596]
  [0.57028596 0.57028596]]

 [[0.44304653 0.44304653]
  [0.44304653 0.44304653]]]

Upvotes: 2

Nils Werner
Nils Werner

Reputation: 36765

What you're asking for is a simple matrix multiplication along the last axis:

import numpy as np

arr = np.random.rand(9,9,200)
transform = np.random.uniform(size=(200, 200)) / 200

arr = arr @ transform

Upvotes: 0

Related Questions