我发现自己需要向现有的numpy数组添加功能,这引发了一个问题,涉及以下代码的最后一部分实际在做什么:
np.ones(shape=feature_set.shape)[...,None]
设置
作为一个例子,假设我希望通过使用numpy并求解来解决线性回归参数估计:
假定我有一个特征集形状(50,1),一个目标形状为(50,),并且希望使用目标变量的形状为拦截值添加一列。
它看起来像这样:
# Create random target & feature set
y_train = np.random.randint(0,100, size = (50,))
feature_set = np.random.randint(0,100,size=(50,1))
# Build a set of 1s after shape of target variable
int_train = np.ones(shape=y_train.shape)[...,None]
# Able to then add int_train to feature set
X = np.concatenate((int_train, feature_set),1)
我认为我知道的东西
当我包含[...,None]与不使用它时,我看到输出的差异。在这里:
第二个版本在需要相同维数的输入数组周围返回错误,最终我偶然发现了使用[...,None]的解决方案。
主要问题
虽然我看到[...,None]的输出给出了我想要的东西,但我正在努力寻找有关实际上应该做的任何信息。谁能告诉我这段代码的实际含义, None 参数在做什么等等?
谢谢!
答案 0 :(得分:2)
[..., None]
的切片由两个“快捷方式”组成:
省略号文字部分:
点(...)代表产生完整索引元组所需的多个冒号。例如,如果x是等级5的数组(即,它具有5个轴),则
x[1,2,...]
等同于x[1,2,:,:,:]
,x[...,3]
至x[:,:,:,:,3]
和x[4,...,5,:]
至x[4,:,:,5,:]
。
(Source)
None
组件:
numpy.newaxis
newaxis
对象可用于所有切片操作中,以创建长度为一的轴。newaxis
是“无”的别名,可以用“无”代替它,结果相同。
(Source)
因此,arr[..., None]
采用维度为N
的数组,并在“末尾”“添加”维度,以得到维度为N+1
的数组。
示例:
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
print(x.shape) # (2, 3)
y = x[...,None]
print(y.shape) # (2, 3, 1)
z = x[:,:,np.newaxis]
print(z.shape) # (2, 3, 1)
a = np.expand_dims(x, axis=-1)
print(a.shape) # (2, 3, 1)
print((y == z).all()) # True
print((y == a).all()) # True
答案 1 :(得分:1)
考虑以下代码:
np.ones(shape=(2,3))[...,None].shape
如您所见,“无”短语将(2,3)矩阵更改为(2,3,1)张量。实际上,它将矩阵置于张量的LAST索引中。
如果您使用
np.ones(shape=(2,3))[None, ...].shape
将矩阵放在张量的FIRST索引中