【问题标题】:Explicitly broadcasting a scalar显式广播标量
【发布时间】:2023-01-07 21:40:09
【问题描述】:

是否可以显式广播一个标量以适应某种类似于

s[..., np.newaxis]

(所以我想给s加个维度,即使它只是一个标量)

我目前正在向量化很多函数,这样它们就可以同时处理单个数据点或多个数据点。例如。这个函数要么返回一个随机归一化向量,要么一次返回多个:

import numpy as np
def randomu(N, M=None):
    """Returns one or M random normalized vectors of R^N."""
    v = np.random.normal(size=N if M is None else (M, N))
    return v / (np.linalg.norm(v) if M is None else np.linalg.norm(v, axis=-1)[:, np.newaxis])

可以看出这个函数基本上是单向量版本和多向量版本用两个三元条件拼接在一起。但是,如果可以向np.linalg.norm(v, axis=-1) 广播一个附加轴,无论它是标量还是向量,那么我的很多函数都可以向量化得更清晰。

准确地说:我希望上面的函数为参数N, None返回一个N-array,并为参数N, M返回一个M,N-array,其中M是一些正整数。 (M=NoneM=1之间存在一维差异)

这会给这个解释函数一个类似于np.zerosnp.random.normal,......的大多数numpy函数的签名。可能几乎所有将整数或元组作为形状参数的numpy函数。

【问题讨论】:

  • 标量可以转换为0维数组:np.array(0).ndim -> 0
  • @MechanicPig 这正是我要找的。我不知道那是可能的。非常感谢你。
  • @Sebig3000,还有keepdims关键字参数;我相信您可以在最后一行写上return v / np.linalg.norm(v, axis=-1, keepdims=True),以避免显式重新引入尺寸为 1 的广播维度,它也会处理 1 轴数组

标签: python numpy numpy-ndarray array-broadcasting


【解决方案1】:

添加@MechanicPig 的答案以将问题标记为已回答:

0 维数组是可能的:np.array(0).dim -> 0

要广播具有 0 维或更多维的数组,Ellipsis 可用于涵盖所有情况:

import numpy as np
def randomu(N, M=None):
    """Returns one or M random normalized vectors of R^N."""
    v = np.random.normal(size=N if M is None else (M, N))
    return v / np.array(np.linalg.norm(v, axis=-1))[..., np.newaxis]

然后该函数按需要工作并给出:

randomu(2), randomu(2, 1), randomu(2, 3)
>>> array([0.05777662, 0.99832954]),
    array([[-0.6129825 ,  0.79009648]]),
    array([[-0.77999393,  0.62578709],
           [-0.86964848,  0.49367147],
           [ 0.80254365, -0.5965934 ]])

【讨论】:

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