【问题标题】:efficient way to operate on the ndarray对ndarray进行操作的有效方法
【发布时间】:2021-10-23 11:03:01
【问题描述】:

存在一个形状为[100,50, 5]的numpy ndarry A,我想将A扩展如下。 A 将附加一个形状为(50, ) 的一维数组。生成的A 的形状为[100,50,6]

这个一维数组的元素是基于原ndarray中的数组,即A[:,:,4]根据给定的公式,即A[:,i,5]=A[:,i,4]*B[i]+5 for i = 0:49这里A[:,:,5]对应的是添加的一维数组. B 是另一个作为权重的数组。 除了使用 for 循环编写此函数外,如何利用numpy 操作以矢量化/高效的方式完成此任务

【问题讨论】:

  • A[:,:,4] 是 (100,50)。 B 是 (50,)。您应该可以将它们添加 +5 以制作新的“列”
  • 对于担心“矢量化/高效方式”的人,您似乎跳过了一些基本的numpy 阅读。例如numpy.org/doc/stable/user/… 和以下部分。

标签: python-3.x numpy lambda scipy numpy-ndarray


【解决方案1】:

制作 2 个数组 - 我们可以查看大小:

In [371]: A = np.arange(24).reshape(2,3,4); B = np.array([10,20,30])

由于broadcasting,我们可以在(2,3)数组中添加一个(3,)数组

In [372]: A[:,:,-1]+B
Out[372]: 
array([[13, 27, 41],
       [25, 39, 53]])

然后我们可以将其转换为 (2,3,1) 数组:

In [373]: (A[:,:,-1]+B)[:,:,None]
Out[373]: 
array([[[13],
        [27],
        [41]],

       [[25],
        [39],
        [53]]])
In [374]: A
Out[374]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

并在最后一个轴上加入它们:

In [375]: np.concatenate((A, Out[373]), axis=-1)
Out[375]: 
array([[[ 0,  1,  2,  3, 13],
        [ 4,  5,  6,  7, 27],
        [ 8,  9, 10, 11, 41]],

       [[12, 13, 14, 15, 25],
        [16, 17, 18, 19, 39],
        [20, 21, 22, 23, 53]]])

或者我们可以创建一个大小合适的目标数组,并将值复制到其中:

In [376]: A1 = np.zeros((2,3,5),int)
In [377]: A1[:,:,:-1]=A
In [379]: A1[:,:,-1]=Out[372]

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多