【发布时间】: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=None和M=1之间存在一维差异)
这会给这个解释函数一个类似于np.zeros,np.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