【问题标题】:Multiply same numpy array with scalars multiple times多次将相同的numpy数组与标量相乘
【发布时间】:2021-12-06 11:18:10
【问题描述】:

我有一个大小为 (9,9,200) 的 3D NumPy 数组和一个大小为 (200,200) 的 2D 数组。 我想获取形状为(9,9,1) 的每个通道并生成一个数组(9,9,200),每个通道在一行中乘以1 个标量200 倍,然后对其进行平均,使得结果数组为(9,9,1)
基本上,如果输入数组中有n 通道,我希望每个通道乘以n 次并取平均值——这应该发生在所有通道上。有没有有效的方法?

到目前为止,我所拥有的是这个 -

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

编辑: 演示我正在寻找的示例图像。这里nchannel = 3。 输入图像是arr。最终的图像是转换后的arr

【问题讨论】:

  • 你能发布一个最小的可执行示例吗?我不确定 arr 和 nchannel 是什么...
  • 我不确定我是否得到你想要的,二维数组有什么用? n 个标量从何而来?
  • 也许可以添加到 sehan2 的评论中,如果它不是9 x 9 x 200,而是像2 x 2 x 3 这样具有预期输出的玩具示例,那将非常有帮助:-) 我很遗憾这样做从问题中不明白你的问题..
  • 感谢您指出@sehan2。 @user16648691 二维数组是一个 nxn 矩阵,每一行对应一个通道将乘以的 n 个标量。
  • 如果我理解这一点,那就是张量乘以矩阵,然后在轴 -1 上取平均值?

标签: python numpy numpy-ndarray tensor array-broadcasting


【解决方案1】:

编辑:

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)

输出:

[[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]]]

【讨论】:

  • 嗨@user16648691,我认为这不是正确的解决方案。我添加了一个图表以更好地强调我在寻找什么。
  • 所以这里我们有一个 2x2x3 标量数组和一个包含通道的 3x3 数组,对吗?首先对于每个大小为 3 的通道,我们得到一个 2x2x3 数组,它基本上是标量数组乘以通道的每个元素的乘法元素?所以你最终得到一个 2x2x3x3 数组,你最终在最后一个轴上平均得到一个 2x2x3 数组?如果我错了,请纠正我
  • 如果是这种情况,我将首先对每个通道进行平均,这样您就可以得到一个大小为 n_channel 的一维数组,您可以将其与标量数组相乘。我将编辑我的答案。
【解决方案2】:

您要求的是沿最后一个轴的简单矩阵乘法:

import numpy as np

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

arr = arr @ transform

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多